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))     

剩下的一个问题是:当你有一个数据结构时,你想以某种方式使用它的一部分并且你想给这些部分临时命名——怎么做?

在您的示例中,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 回答