是否可以使用`eval`在Lisp中实现`apply`?

我正在学习Racket(一个类似于Scheme的方案),我试图做一些事情(申请'(1 2)),但没有使用申请,我失败了.我几乎可以确定之前应用可以使用eval以某种方式模拟,但现在我有疑虑.

所以,我的问题是:可以仅使用eval和其他基本操作在Racket(或其他Lisp)中实现吗?也就是说,如何使这项工作:

{ define [my-apply f arg]
  ;; what does go here?
}
(my-apply + (list 1 2)) ; => 3

最佳答案 当然.

(defun my-apply (function arglist)
  (eval (cons function (mapcar (lambda (x) (list 'quote x)) arglist))))
(my-apply '+ '(1 2 3))
6
(my-apply '+ '(1 a 3))
*** - +: A is not a number

>请注意,你不能这样做(我的申请#”(1 2 3)),这需要一个额外的步骤.
>请注意,您必须引用arglist元素以避免双重评估(感谢Ryan捕获它!)

点赞