Lisp中的Pascal Triangle

时间:2014-09-18 04:01:10

标签: java lisp common-lisp

我刚刚开始学习Lisp,我无法理解this code from Rosetta Code所说的内容:

(defun pascal (n)
   (genrow n '(1)))

(defun genrow (n l)
   (when (< 0 n)   //is the command "when" something like if in Java?
       (print l)
       (genrow (1- n) (cons 1 (newrow l)))))

(defun newrow (l)
   (if (> 2 (length l))
      '(1)
      (cons (+ (car l) (cadr l)) (newrow (cdr l)))))

我一直在关注一些关于口齿不清的网站,但它仍然令人困惑。我所知道的唯一编程语言是Java。如果有人能用Java解释大胆部分的内容,我将不胜感激。

1 个答案:

答案 0 :(得分:2)

Lisp使用前缀表示法,因为在其他语言中通常是运算符(即+, - ,&gt;)的东西被认为是Lisp中的函数。 Lisp中的(+ 1 1)相当于Java中的1 + 1;。您可以将其视为调用带有1和1作为参数的add函数:add(1, 1)它只需要一些习惯。

因此(> 2 (length l))相当于2 > length(l)

'中的'(1)告诉Lisp将后面的内容视为文字。因此,不是Lisp寻找一个名为1的函数(没有反引号就会发生这种情况),而是返回一个包含1作为元素的列表。在Lisp中说同样的方法是(quote (1)),它返回包含1的文字列表。