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

时间:2013-03-21 14:29:31

标签: lisp racket

我正在学习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

2 个答案:

答案 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
  1. 请注意,您无法执行(my-apply #'+ '(1 2 3)),这需要额外的步骤。

  2. 请注意,您必须引用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

它有什么问题吗?