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 に答える