我刚刚开始学习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解释大胆部分的内容,我将不胜感激。
答案 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的文字列表。