0

私はまだLispの読書速度を上げようとしています。そのため、私の最初の傾向は、私の理解の遅さを補うために、すべて (通常は let バインディング内) に名前を付けようとすることです。オンラインの例では、バインドされているものと、その場で使用されているものとが常に混在しています。

(1 2 4 + 4) を解析するこのばかげた s 式のように、let バインディングを使用して記述できます。

 (let [first-nums  (take (- (count args) 2) args)
       last-num (last args)
       fun (nth args (- (count args) 2))]
    (reduce fun (conj first-nums last-num))))

またはなし:

  (reduce (nth args (- (count args) 2))
          (conj (take (- (count args) 2) args)
                (last args)))))

一方では、「概念」に適切なドメイン名を与えることは、c スタイルの言語で作業するときに非常に信じていることです。 let のスコープは非常に厳密に定義されていますが、それでも非常に反機能的であると感じています。拘束状態。 バインディングをいつ使用するかの基準は何ですか?

4

1 に答える 1

4

物事に名前を付けることは問題ありません。物事を自己文書化するのに役立ちます。何も問題はありません。物事が明白すぎる場合は、時々それを取り除きたいと思うかもしれません:

(let ((number1 12)
      (number2 30))
  (+ number1 number2))

上記は式にあまり追加されません(+ 12 30)。しかし、ドメイン値を文書化したい場合は、代わりに

(let ((number1 12)        ; border width
      (number2 30))       ; table width
  (+ number1 number2))

より良い書き込み

(let ((table-width 30)
      (border-width 12))
   (+ table-width border-width))     

残っている 1 つの質問は次のとおりです。データ構造がある場合、その一部を何らかの方法で使用したい場合、これらの部分に一時的な名前を付けたいと考えています。その方法は?

あなたの例でLETは、名前を紹介し、値を抽出するために手書きのコードを提供します。

少し「良い」は、より説明的なアプローチになる可能性があります。

(match-let (*args1 function arg2)                  ; a pattern
      expression                                   ; a data structure
   (reduce function (append args1 (list arg2))))   ; a body

コードでそのようなパターンを頻繁に処理する必要がある場合、上記のようなものは理にかなっています。これにより、コードがより宣言的になります。

于 2013-01-12T14:54:33.210 に答える