EoPL reading (141) 3.2 The Front End
EoPL の練習問題をがっつりヤるか、GAE 方面にニゲるか、入門 Git に走るか悩ましいと言いつつ gdgd 続行。# 今 1300
Excersize 3.5
当分 primitive の追加な問題が続く。おそらくは
- parse-expression 手続き
- apply-primitive 手続き
に分岐を追加をしてあげれば良いのかな、と言いつつ apply-primitive 見てると以下な記述があるな。
(cases primitive prim
てーコトは primitive を define-datatype してるソレにも追加が必要か。
続き
上記、今日の昼頃のログなんですが、今は 1900 過ぎです。なんとなくヤル気が起きないのは scan&parse が動いてないからなんだろーか、と思いつつもパーサが違うだけなのでいいじゃん、と自分を納得させつつ無理矢理手を動かす。
まず、primitive を定義しているソレに追加。
(define-datatype primitive primitive? (add-prim) (subtract-prim) (mult-prim) (incr-prim) (decr-prim) (print-prim))
次、apply-primitive 手続き。
(define apply-primitive (lambda (prim args) (cases primitive prim (add-prim () (+ (car args) (cadr args))) (subtract-prim () (- (car args) (cadr args))) (mult-prim () (* (car args) (cadr args))) (incr-prim () (+ (car args) 1)) (decr-prim () (- (car args) 1)) (print-prim () (print (car args)) 1) )))
残りは parse-expression 手続きで以下。
(define parse-expression (lambda (datum) (cond ((number? datum) (list 'lit-exp datum)) ((symbol? datum) (list 'var-exp datum)) ((pair? datum) (list 'primapp-exp (list (cond ((eq? '+ (car datum)) 'add-prim) ((eq? '- (car datum)) 'subtract-prim) ((eq? '* (car datum)) 'mult-prim) ((eq? 'add1 (car datum)) 'incr-prim) ((eq? 'sub1 (car datum)) 'decr-prim) ((eq? 'print (car datum)) 'print-prim) )) (map (lambda (x) (parse-expression x)) (cdr datum)))))))
試験書くか。ってこれ、戻りが 1 な試験しか書けんじゃないか。今朝の要領で REPL で確認な方向で。あ、これもモチベーションが微妙な所以?
$ gosh gosh> (add-load-path ".") ("." "/usr/share/gauche/site/lib" "/usr/share/gauche/0.8.13/lib") gosh> (load "parse-program") #t gosh> (load "Fig3.2") define-datatype.scm version J3 2002-01-02 10:55 define-datatype.scm version J3 2002-01-02 10:55 #t gosh> (define input-prompt ";;; eval input:") (define output-prompt ";;; eval value:") (define display-prompt (lambda (str) (newline) (display str) (newline))) (define read-eval-print (lambda () (display-prompt input-prompt) (let ((input (read))) (let ((output (eval-program (parse-program input)))) (display-prompt output-prompt) (print output))) (read-eval-print)))input-prompt gosh> output-prompt gosh> display-prompt gosh> read-eval-print gosh> (read-eval-print) ;;; eval input: (print 1) 1 ;;; eval value: 1 ;;; eval input: (print (+ 2 3)) 5 ;;; eval value: 1 ;;; eval input:
これで OK ってコトにしていいッスか? (を
とりあえず
今から GAE の tutorial やりつつ Git で云々で気分を変えてみる方向。