【问题标题】:Pascal Triangle in LispLisp 中的帕斯卡三角形
【发布时间】:2014-11-12 06:44:25
【问题描述】:

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

(defun 帕斯卡 (n) (genrow n '(1))) (defun genrow (n l) (when (//是Java中类似if的命令“when”吗? (打印 l) (genrow (1- n) (cons 1 (newrow l))))) (defun newrow (l) (如果 (> 2 (长度 l)) '(1) (缺点 (+ (car l) (cadr l)) (newrow (cdr l)))))

我一直在查看一些有关 lisp 的网站,但仍然令人困惑。我知道的唯一编程语言是 Java。如果有人可以用 Java 解释粗体部分的含义,我将不胜感激。

【问题讨论】:

    标签: java lisp common-lisp


    【解决方案1】:

    Lisp 使用前缀表示法,因为在其他语言中通常是运算符(即 +、-、>)的东西在 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 的文字列表。

    【讨论】:

    • 那么,当我调用 genrow 方法时,我传入了 n 和一个列表?
    • 没错。我刚刚看到您还询问了whenwhen 函数(实际上是一个宏)就像 Java 中的 if 语句。不同之处在于,在 Lisp 中,普通的if 函数只有一个“then”语句,然后是一个“else”语句。 when 宏允许多个“then”语句。请参阅this 了解更多信息。
    • 非常感谢您的帮助:D
    • @nonex 在谈论 Common Lisp 时,您不应该指向 elisp 文档,CLHS 是一个更好的参考。特别是当 elisp 与 CL 的定义不匹配时。 Elisp 的 if 需要多个 else 子句,而在 CL 中则不然。 lispworks.com/documentation/HyperSpec/Body/s_if.htm
    猜你喜欢
    • 2012-10-24
    • 1970-01-01
    • 2015-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多