【发布时间】:2014-10-01 23:58:51
【问题描述】:
我刚开始玩 Lisp (Common-Lisp),这是一个计算数字列表平均值的函数
CL-USER> (defun average (list) (/ (apply #'+ list) (length list)))
AVERAGE
CL-USER> (average '(1 2 3 4))
5/2
但是如果我像这样重写函数
CL-USER> (defun average (list) (/ (+ list) (length list)))
它不起作用,因为 (+ '(list-of-numbers)) 无法评估,因此长度的争论和 + 中的表达式不兼容。
有没有一种哄骗(列表)的方法可以自然地被 + 评估为表达式并作为数据传递给 length ?而不是使用 apply #'
我试过这个:
(defun average (list) (/ (+ list) (length '(list))))
但这似乎也不行!
【问题讨论】:
-
您是否有实际的理由希望能够做到这一点?我认为您的问题是语法 (function (arg1 arg2)) 在某种程度上比 (function arg1 arg2) 更“自然”。
-
没有理由,我只是想明白!再次不, (function arg1 arg2) 似乎更“自然”(非常主观!诚然),在我看来,对函数如何看待 args 而不是“过度骑行”进行操作会更“自然” " 适合 args 的函数(带有尖引号)。如果你明白我的意思。由于quote(list) 绕过了默认的评估规则,我只是想知道是否有一些我在某处遗漏的引用的“逆”。
标签: lisp common-lisp