4

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

2 回答 2

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 抓住这一点!)

于 2013-03-21T14:54:24.960 回答
0

我找到了这个(在球拍中):

{ 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

有什么问题吗?

于 2013-03-25T16:18:54.400 回答