【发布时间】:2013-11-25 14:40:55
【问题描述】:
我是一个Lisp新手,业余时间慢慢学习……几个月前,我被一个Lisp REPL的错误报告弄糊涂了,下面的表达式不起作用:
((if (> 2 1) + -) 1 2)
环顾四周,我知道 Lisp 不是 Scheme……在 Lisp 中,我需要这样做:
(funcall (if (> 2 1) '+ '-) 2 1),或
(funcall (if (> 2 1) #'+ #'-) 2 1)
我还浏览了有关 lisp-1 和 lisp-2 的介绍性材料,虽然我无法将那里的所有内容全部归类...无论如何,我知道 quote 会阻止评估,作为一个例外到评估规则。
最近我在读一些关于reduce...然后作为练习,我想编写我自己的reduce 版本。虽然我设法让它工作(至少看起来工作),但我意识到我仍然无法准确解释为什么在 defun 的正文中,有些地方需要 funcall,而有些地方不需要。
以下是elisp中的myreduce:
(defun myreduce (fn v lst)
(cond ((null lst) v)
((atom lst) (funcall fn v lst))
(t (funcall fn (car lst) (myreduce fn v (cdr lst))))))
(myreduce '+ 0 '(1 2 3 4))
我的问题是关于第 3 行和第 4 行的:
第三行:为什么我需要
funcall?为什么不只是(fn v lst)?我的“论点”是在(fn v lst)中,fn是列表中的第一个元素,因此 lisp 可能能够使用此位置信息将其视为函数……但事实并非如此。所以我当然错过了一些东西。myreduce的递归调用中的第 4 行:什么样的fn被传递给myreduce的递归调用?'+或+,还是别的什么?
我想应该有一些我不知道的非常基本的东西......我想知道,当我调用myreduce 时,如第 6 行/最后一行所示,之后到底发生了什么(至少关于'+ 被传递),有没有办法在任何 REPL 环境中跟踪它?
非常感谢,
/布鲁因
【问题讨论】:
-
用于跟踪使用
TRACE。