【问题标题】:Learning Lisp. Can't seem to get a value from one function and use it within another学习 Lisp。似乎无法从一个函数中获取值并在另一个函数中使用它
【发布时间】:2012-12-23 08:03:36
【问题描述】:

我正在尝试在列表中找到最大数量,然后对其进行处理:

(defun maxList (l)
    (if (= (length l) 1)
            (first l)
        (if (> (first l) (maxList (rest l)))
            (first l)
            (maxList (rest l))
        );if
    );if
);defun


(defun try-let (l)
    (let (a (maxList l))
    (print a)
    );let
);defun

但是它打印 null,但 maxList 有效。我做错了什么?

【问题讨论】:

标签: lisp common-lisp let


【解决方案1】:

您缺少一对括号:

(let ((a (maxList l)))

这是因为let 采用如下绑定列表

(let ((a 1) (b 2) (c 'foo))
  expr)

所以在这种情况下,您必须传递一个包含绑定 (a (maxList l)) 的单元素列表

【讨论】:

  • 啊哈,好的,谢谢!我很难跟上括号。即使我有一些工作示例并使用记事本++(现在已经足够),我仍然迷失在其中。
  • @Kalec 如果您不查找括号,则很容易注意到缺少括号,而是查看缩进。信不信由你,在 lisp 中它们并不像在其他语言中那样重要,它们仅用于分隔表达式。程序员看着缩进,他们让他们的编辑担心它,以及匹配括号。这就是为什么 lispers 会告诉你永远不要将括号留在自己的行中,这使它们比实际更重要。查看cliki.net/Programming%20style
  • 要补充一点,我不得不说,当我开始学习 lisp 时(2012 年 2 月)使用支持您的代码的编辑器 notepad++(即使它很棒),这真的很值得如果你将它用于 lisp,会导致脑痛。我通过学习 emacs 来做到这一点,就像我学习 lisp 一样。老实说,与我们使用某些语言的开发方式相比,能够通过简单的组合键将代码从源文件触发到 repl 是一种变革性的体验。我推荐 emacs24 和 slime(也可以选择 paredit,但是当你习惯了它如何处理你的代码时,这会让你很烦!)。祝你好运,快乐的 lisping!
【解决方案2】:
(defun maxList (l)
  (if (= (length l) 1)

致电LENGTH 不是一个好主意。它遍历整个列表。

      (first l)
    (if (> (first l) (maxList (rest l)))
        (first l)
      (maxList (rest l)))))

以上调用MAXLIST 两次。也许这里LET 有用吗? MAX这个函数怎么样?

如果你编译你的函数,Common Lisp 系统会报错。

CL-USER 35 > (defun try-let (l)
               (let (a (maxList l))
                 (print a)))
TRY-LET

CL-USER 36 > (compile 'try-let)
;;;*** Warning in TRY-LET: MAXLIST is bound but not referenced

这表明 Lisp 编译器认为 MAXLIST 是一个变量。出了点问题。接下来查看LET的语法。

Special Operator LET, LET*

let ({var | (var [init-form])}*) declaration* form* => result*

这表示它是变量列表或(变量initform)列表。所以你可以看到你错过了让它成为一个列表。您刚刚编写了一个绑定。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-28
    • 2017-12-14
    • 2019-12-13
    • 2018-12-02
    • 1970-01-01
    • 2016-10-20
    相关资源
    最近更新 更多