2009.03.02 02:18

TAOI source code preliminary 1

The Art Of the Interpreter 의 동작을 위해 만든 소스코드
일부 소스코드를 이용하고 바꾸고 해서 중요한 이해를 실감하기 위한 키보드 연습
현재 까지는 부분 구현이다.

environment 가 없이 procedure 에 정의된 환경만을 다룬다.
이부분은 설명이 필요핟.

작업 1일차 : fig 2까지 고쳐봄 - 완성본이 아니다.
이유는  생각을 해가면서 고쳐가고 돌려가면서 고칠 것이기 때문이다.
lisp 의 시작으로부터 이 정도의 깨달음까지 10여년이 걸렸다.


;;This is taoi driver loop
;; modified and re-interpreted by AnYunho


(define (driver)
  (driver-loop <the-primitive-procedures> (print '|LISP ITH LITHTENING|'))
  )

(define (drive-loop procedures hunoz)
  (driver-loop-1 procedures (read)))
;driver loop is main loop
; (read) is fed to form
(define (driver-loop-1 procedures form  )
  (cond ((atom form )
         (drive-loop procedures (print (eval form '() procdures))))
        ((eq (car form ) 'define)
         (driver-loop (bind (list (caadr form ))
                             (list (list (cadar form (caddr form ))) procedures)
                      (print caadr form ))))
        (t (driver-loop procedures (print (eval form '() procdures))))
       
     )
 )

;; (define (f x y) (+ x y ))

;;car --> define
;;cdr -->((f x y)..)
;;cadr -->(f x y)
;;caadr -->f  :name
;;cdadr--> (x y) :arguments
;;cddr -->((+ x y)..)
;;caddr --> (+ x y) : body of procedures


(define (mceval exp env procedures)
  (cond ((not (list? exp)) ;;atom exp
        ( cond
           ((eq exp 'nil) nil)
           ((eq exp '#t) #t)
           ((number? exp ) exp)
           (else  (value exp env))
         ))
     
        ((eq (car exp)'quote) ( cadr (exp)))
        ((eq (car exp)'cond) ( evcond (cdr exp)  env procedures))
       
        (else
         (mcapply (value (car exp) env procedures)
                (evlis (cdr exp)  env procedures)))
       ))

 

(define (mcapply fun args procedures )
  (cond ((primop fun)
         (apply-primitive-procedure procedure arguments))
       
        (else mceval (cadr fun ) (bind car fun args '() procedures))))


(define (evcond clauses env procedures )

    (cond ((null? clauses) '())

          ((mc-eval (car (car clauses)) env procedures)
           (mc-eval (car (car clauses)) env procedures))
      (else (evcond (cdr clauses) env  procedures))))

 (define (evlis  arglist env  procedures)        ;map evaluator over list

    (cond ((null? arglist) '())

          (else (cons (mc-eval (car arglist) env procedures)

                      (evlist (cdr arglist) env procedures))))))


 

신고
Trackback 16 Comment 0


티스토리 툴바