我正在学习Racket(一种类似Scheme的Lisp),我试图做(apply + '(1 2))
但不使用apply
但我失败了。我之前几乎确定apply
可以使用eval
以某种方式进行模拟,但现在我有疑问。
所以,我的问题是:只能使用apply
和其他基本操作在Racket(或其他Lisp)中实现eval
吗?也就是说,如何使这项工作:
{ define [my-apply f arg]
;; what does go here?
}
(my-apply + (list 1 2)) ; => 3
答案 0 :(得分:2)
不确定
(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
请注意,您无法执行(my-apply #'+ '(1 2 3))
,这需要额外的步骤。
请注意,您必须引用arglist
元素以避免重复评估(感谢Ryan抓住它!)
答案 1 :(得分:0)
我找到了这个(在Racket中):
{ define [my-apply func args]
{ define ns-for-eval (make-base-namespace) }
(eval (cons func args) ns-for-eval)
}
(my-apply + (list 1 2)) ; => 3
它有什么问题吗?