我正在学习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捕获它!)