0

私は現在、小さなプロジェクトのLISP演習に取り組んでおり、深刻な支援が必要です。これは多かれ少なかれ初心者の質問かもしれませんが、2つの未評価の関数を取り込んで、変数に割り当てが与えられているかどうかに応じて結果を吐き出す特定の関数を書くことに完全に迷っています。

例は

(setq p1 '(+ x (* x (- y (/ z 2)))))

どこ

(evalexp p1 '( (x 2) (z 8) ))
    returns (+ 2 (* 2 (- y 4)))

私の目標はevalexp関数を書くことですが、どこから始めればよいのかさえ考えられません。

これまでのところ私は

(defun evalexp (e b) )

.. それほどでもない。誰かが私を助けてくれるか、良い方向に導いてくれるなら、私は感謝以上のものになるでしょう。

4

2 に答える 2

1

これが完全な解決策です。非常に簡単なので、完全な説明は省略します。自分で理解できないことがあれば、コメントで私に聞いてください。

eval実際の評価を行うために使用することは、演習/プロジェクトで望むものではない可能性があります。別の方法については、「メタサーキュラーインタープリター」を調べてください。)

(defun apply-env (exp env)
  (reduce (lambda (exp bdg) (subst (cadr bdg) (car bdg) exp))
          env :initial-value exp))

(defun try-eval (exp)
  (if (atom exp)
      exp
      (let ((exp (mapcar #'try-eval exp)))
        (if (every #'numberp (cdr exp))
            (eval exp)
            exp))))

(defun evalexp (exp env)
  (try-eval (apply-env exp env)))
于 2011-03-08T12:47:30.677 に答える
0

ここにヒントがあります、これはあなたがそれをするかもしれない方法です(擬似コードで):

function replace(vars, list):
    for each element of list:
        if it's an atom:
            if there's an association in vars:
                replace atom with value in vars
            else:
                leave atom alone
        else:
            recursively apply replace to the sublist

これをLispコードに変換するときに、解決すべき詳細が確かにあります。

于 2011-03-08T04:33:25.153 に答える