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 で云々で気分を変えてみる方向。