3

リテラルをSchemeの式として評価しようとしています(現在Guileを使用)。例:

(define x '(+ 6 6))
(define y (evaluate-literal x))     ; Expected result:  y = 12

(ここに、evaluate-literal私が探しているもののプレースホルダーがあります。)これを可能にするlisp関数/イディオムはありますか?これを行う必要がある理由は、式が定義時に無効である可能性があるが、後で評価されるときに有効な式になるためです。


現在、私の回避策はを使用することですが、あまりエレガントではありませんdelayforce

(define x (delay (+ 6 6)))
(define y (force x))
4

1 に答える 1

2

eval安全に使用することは困難ですが、最も簡単な方法はを使用することです。理由については、この投稿を参照してください。

(define x '(+ 6 6))
(define y (eval x))

組み込みのdelay/force手順を使用することは、優れたソリューションです。

(define x (delay (+ 6 6)))
(define y (force x))

または、コメントで示唆されているように、独自の構文lambdaを実装するためにを使用できます。delay/force

(define-syntax my-delay
  (syntax-rules ()
    ((my-delay object)
     (lambda () object))))

(define (my-force delayed-object)
  (delayed-object))

(define x (my-delay (+ 6 6)))
(define y (my-force x))

lambda上記はおもちゃの実装です。実際の実装では、毎回呼び出す必要がないように結果をメモしますが、アイデアは得られます。

于 2012-09-08T00:06:35.983 に答える