6

私はSICPを使用しています。1つの演習はforeach(doseq)を実装することです。これは学術的な演習です。clojureでは、これが私が思いついたものです:

(defn for-each [proc, items]
  (if (empty? items) nil
      (do
        (proc (first items))
        (recur proc (rest items)))))

doしかし、それが不正行為であるかどうかについては少し曖昧です。これdoはclojureの特殊な形式であり、SICPではまだそのようなものが導入されていないと思います。もっとミニマリストの答えはありますか?

最後の要素でのみprocを実行する別の試みを次に示します。

(defn for-each-2 [proc, items]
  (let [f (first items)
        r (rest items)]
    (if (empty? r)
      (proc f)
      (recur proc r))))
4

2 に答える 2

3

使用doseqすれば、準備は完了です。例えば:

(doseq [e '(1 2 3)]
       (prn e))

印刷します:

1
2
3
nil

編集 :

手作業で実装し、特別なフォームをできるだけ少なくしたい場合はfor-each、別の方法がありますが、最終的には自分のフォームとほぼ同じになります。

(defn for-each [f l]
  (cond (empty? l) nil
        :else (do (f (first l)) 
                  (recur f (rest l)))))

興味深いことに、同じ手順が、SICPで使用されるLisp方言であるSchemeでより簡潔に記述されている可能性があります。

(define (for-each f l)
  (cond ((null? l) null)
        (else (f (first l))
              (for-each f (rest l)))))
于 2012-02-26T19:12:38.790 に答える
1

これが私の試みです。内部ループで関数を実行するだけです。

(defn for-each [fun, xs]
  (loop [fun fun
         xs xs
         action nil]
    (if (first xs)
      (recur fun (rest xs) (fun (first xs)))
      xs)))
于 2012-02-26T20:45:30.430 に答える