我想缩进下面的一段代码.一个lisper如何缩进呢?我特别担心在哪里放新线.
(defn primes [n]
(letfn [(sieve [table removal]
(assoc table removal false))
(primebools [i table]
(cond
(= i n) table
(table i) (recur (inc i)
(reduce sieve
table
(range (* i i) n i)))
:else (recur (inc i)
table)))]
(let [prime? (primebools 2 (apply vector (repeat n true)))]
(filter prime? (range 2 n)))))
Run Code Online (Sandbox Code Playgroud) 我有一些看起来像这样的clojure代码:
(defn rect [x y w h]
{:x x, :y y, :w w, :h h})
(def left :x)
(def top :y)
(def width :w)
(def height :h)
(defn right [r]
(+ (left r) (width r)))
(defn bottom [r]
(+ (top r) (height r)))
Run Code Online (Sandbox Code Playgroud)
现在,以下代码似乎有点不常见:
(def left :x)
Run Code Online (Sandbox Code Playgroud)
但是,我不知道任何其他方式来获得封装.
假设,我后来想以不同的方式表示我的矩形.然后依赖(:x rect)不是一个好主意,因为:x只适用于hashmap和记录,因此我会在api中泄漏实现细节,至少在OO语言中被认为是不好的做法.
现在,如果我决定在java中实现我的rect,它会变得更糟,因为那时我必须编写包装器,如:
(defn left [rect] (.getLeft rect))
Run Code Online (Sandbox Code Playgroud)
确保界面不会改变.
clojure如何解决这个问题?
似乎有两种方法可以用C++表示卡片.
显而易见的方式是:
const int numCards = 52;
const int numRanks = 13;
const int numSuits = 4;
enum Suit {
HEARTS = 1;
DIAMOND = 2;
SPADES = 3;
CLUBS = 4;
}
card Class {
private:
const Suit suit;
const int rank;
public:
/// Constructor
Card(int rank, Suit suit)
/// Get rank between 1 and 13
int getRank();
/// Get suit
Suit getSuit();
/// Get string representation
std::string toString();
};
Run Code Online (Sandbox Code Playgroud)
还有另一种方法,整个卡由一个字节表示.
namespace Cards {
typedef byte Card;
/// Constructor …Run Code Online (Sandbox Code Playgroud)