小编Mos*_*erd的帖子

如何正确缩进clojure/lisp?

我想缩进下面的一段代码.一个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)

lisp primes code-formatting clojure indentation

7
推荐指数
1
解决办法
1460
查看次数

如何封装在clojure中?

我有一些看起来像这样的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如何解决这个问题?

encapsulation clojure wrapper

5
推荐指数
1
解决办法
189
查看次数

表示适合整数的数据类型

似乎有两种方法可以用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)

c++ data-representation

1
推荐指数
1
解决办法
60
查看次数