2

Common Lisp ではdefun、複数を同じクロージャに配置して、それらすべてに関数を設定することができます。

(let ((number 0))
  (defun get-number () number)
  (defun set-number ( arg ) (setq number arg)))

ただし、clojure で同じ構文を使用すると、最後の関数だけが定義されてしまいます。

(let [ number 0 ]
  (defn get-number [] number)
  (defn set-number [ arg ] (def number arg)))

両方の機能にアクセスできるように、このコードを clojure に変換する方法はありますか?

4

2 に答える 2

6

user593508 は、文字通りの翻訳に関して良い答えを出します。

しかし、副作用のあるセッターとゲッター関数の背後にカプセル化されたデータの使用が推奨されていない Clojure では、これは少し単調です。Clojure は、純粋な関数と、管理された参照による状態の明示的な制御を強調する傾向があります (データ構造と管理された参照に関する Rich Hickey によるこの優れたビデオを参照してください) 。

別の方法として、変更可能な数値を格納するためにアトムを直接使用することもできます。

(def number (atom 0))

@number
=> 0

(swap! number + 5)
=> 5

@number
=> 5

より簡潔でより慣用的な Clojure であることにswap!加えて、単に取得および設定するだけでなく、アトムの値に対して任意の関数を実行できるという追加の利点が得られます (上記の +5 の例を参照してください)。

于 2012-07-22T05:09:20.820 に答える
5

これがあなたのコードの1つの可能な翻訳です-get-number関数はアクセス可能です。

(let [number (atom 0)]
  (defn get-number []
    @number)
  (defn set-number [arg]
    (reset! number arg)))

(get-number) => 0
(set-number 5)
(get-number) => 5
于 2012-07-22T03:14:46.240 に答える