2010-04-12 1 views
1

내 문제는 내장 된 평가 절차가 아니라 단순한 버전을 만드는 방법입니다. 처음에 나는 이것을 (+ 1 2) 안에 넣고 평가가 보통 평가를 벗어나는 곳에 + 표현식을 평가하게하고 싶습니다.Scheme에 Eval 프로 시저 작성하기?

나는 이것에 대해 생각하고 유용 할 수 있습니다 몇 가지 발견되었습니다 : 인용을 끝내 : (quasiquote) 이 (적용)

내 주요 문제는 절차로하지 +의 가치를 회복됩니다 상징. 일단 내가 그것을 얻을 수 있다고 생각 목록의 다른 내용과 함께 사용할 수 있습니다.

모든 도움말이나 안내를 주시면 감사하겠습니다.

+0

'+'기호에'eval'을 사용할 수 있습니까? –

+0

아니요, 요점은 자신의 평가를 작성하는 것입니다. 내장 된 것만큼 광범위 할 필요는 없습니다. – ZuluForce

+2

http://www.scheme.com/tspl4/examples.html#./examples:h7 – grettke

답변

3

첫 번째로, 자신이하고있는 일을하는 경우 적어도 Metalinguistic Abstraction 섹션의 첫 번째 장인 Structure and Interpretation of Computer Programs을 잘못 읽을 수는 없습니다.


나 자신으로부터 몇 가지 제안을드립니다.

Scheme (또는 실제로는 Lisp) 해석기의 기호와 함께하는 일은 일종의 "환경"에서 그것을 찾는 것입니다. 자신 만의 eval을 쓰려면 자체 환경 구조를 제공해야 할 것입니다. eval을 빌드하는 Scheme 시스템으로 되돌아 갈 수있는 한 가지는 +, cons 등의 바인딩을 포함하는 초기 환경입니다. 이것은 초기 환경 (예 : the-environment 특수 형태의 MIT 구성표 및 interaction-environment (Petite) Chez Scheme 포함)을 사용하는 다양한 방법을 제공하기 때문에 100 % 휴대용 방식으로는 알 수없는 방식으로 달성 할 수 없습니다. ..이 왜 그런지) 나 한테 물어하지만 기본적인 아이디어는 동일하게 유지하지 않습니다 당신은 확실히 심볼 이름 여부를 특별한 형태를 확인하는 것이 좋습니다

(define (my-eval form env) 
    (cond ((self-evaluating? form) form) 
     ((symbol? form) 
     ;; note the following calls PCS's built-in eval 
     (if (my-kind-of-env? env) 
      (my-lookup form env) 
      ;; apparently we're dealing with an environment 
      ;; from the underlying Scheme system, so fall back to that 
      ;; (note we call the built-in eval here) 
      (eval form env))) 
     ;; "applicative forms" follow 
     ;; -- special forms, macro/function calls 
     ...)) 

주 (lambdaif이 필요하다 또는 if 대신 cond을 사용할 수 있습니다. 그러나 기본 세트 (예 : 매크로)에 더 많은 확장을 허용 할 수 있습니다. 위의 해골 eval으로, 이것은 내가 "applicative form"핸들러라고 불리는 곳에서 일어나야 할 것이다. 그러나 당신은 심볼을 다루는 곳에서 이것을 처리 할 수도 있고, 특별한 형태의 핸들러를 먼저 놓고, 정규 심볼 검색과 함수 신청.

+0

감사합니다 !! 이것은 정말로 도움이됩니다. – ZuluForce