1

以下は void 変数エラーで動作しません。これを機能させるには、何をeval置き換える必要がありますか?

;; -*- lexical-binding: t -*-
(defun foo2 ()
  (let ((b 'lkj))
    (lambda ()
      (eval 'b t))))

(funcall (foo2))

symbol-valueどちらも機能しません(文書化されているとおり)。

4

1 に答える 1

3

変数の値を名前で検索することは、適切な字句スコープと基本的に互換性がありません。適切な字句スコープでは、アルファの名前変更が許可されているためです。つまり、(一貫して) 変数の名前を変更しても結果に影響を与えるべきではありません。

もちろん、本当に知る必要がある場合は、場合によっては次のようなことをハッキングできます。

(funcall `(closure ,(nth 1 <someclosure>) () <exp>))

<exp>どこから来たものと同じスコープで評価される可能性があり<someclosure>ます。<someclosure>バイトコンパイルされた場合(または私が間違えた場合)は機能しません。

于 2013-05-05T03:02:34.133 に答える