1

関数の定義方法について何か誤解しているに違いありません。私はこの SICP の演習を行っています。「引数として 3 つの数値を取り、2 つの大きい数値の 2 乗和を返すプロシージャを定義します。」

REPLでこれを試してみましたが、うまくいくようです:

=> (reduce + (map (fn [x] (* x x)) (rest (sort '(2 1 0)))))
5

しかし、プロシージャを定義して数字をパラメータに置き換えると、エラーが発生します。

=> (defn my-procedure [a b c] (reduce + (map (fn [x] (* x x)) (rest (sort '(a b c))))))
ClassCastException clojure.lang.Symbol cannot be cast to java.lang.Number clojure.lang.Numbers.multiply (Numbers.java:146)

何が表示されないのですか? ありがとう!

4

2 に答える 2

1

これはあなたのために働くはずです:

(defn my-procedure [a b c]
  (reduce + (map (fn [x] (* x x)) (rest (sort (list a b c))))))

理由は次のとおりです。

見積もりフォームを使用すると、フォームは評価されず、変数は解決されません。あなたの場合、シンボルのリストが残っています。

user=> (def a 1)
#'user/a
user=> '(a)
(a)
user=> (list a)
(1)
user=> `(a) ;; backtick causes vars to be namespace qualified
(user/a)
user=> (class (first '(a)))
clojure.lang.Symbol

評価されていないフォームを作成するのではなく、list関数または別のコレクションを使用する必要があります

user=> [a] ;; vector
[1]
user=> #{a} ;; set
#{1}

;; (defn sum-of-squares [& args]
;;   (apply + (map #(* % %) args)))
于 2013-01-18T21:55:20.730 に答える
0

関数の引数をコレクションに自動的に入れる:

(defn foo [& x]
  (reduce + (map #(* % %) (rest (sort x)))))
于 2013-01-27T20:19:31.850 に答える