2014年8月23日 星期六

sicp metacircular evaluator (1) - read procedure

有些朋友說我的 blog 都是滿滿的組合語言, 那不是刻意為之的, 組合語言之前沒有秘密, 得把這樣的程式碼挖出來才能理解一些東西。

不過我這陣子換口味了, 滿滿的小括號應該會充斥版面一段時間。

sicp 4.1 要寫一個 Metacircular Evaluator, 簡單說就是用 lisp 來寫一個 lisp, 用到一個 read primitive procedure, 可以當成是內建的 procedure, 這是用來讀取鍵盤輸入的資料。我花了一陣子才搞懂。

r_t.scm
 1 (define (handle_read exp)
 2   (display (car exp))
 3   (newline)
 4   (display (cdr exp))
 5   (newline)
 6   )
 7 
 8 (define (aa)
 9   (newline)
10   (display "aaa")
11   (newline)
12   (handle_read (read))
13   (newline)
14   (display "bbb")
15   (newline)
16   'ok)
17 
18 (aa)

read 回傳的值就當成 handle_read 的 exp 參數內容。

執行結果:

result
 1 
 2 ad "r_t.scm")
 3 
 4 ;Loading "r_t.scm"...
 5 aaa
 6 ('a)
 7 (quote a)
 8 ()
 9 
10 bbb
11 ;... done
12 ;Value: ok
13 
14 1 ]=> (load "r_t.scm")
15 
16 ;Loading "r_t.scm"...
17 aaa
18 'z
19 quote
20 (z)
21 
22 bbb
23 ;... done
24 ;Value: ok
25 
26 1 ]=> 
27 
28 
29 (load "r_t.scm")
30 
31 ;Loading "r_t.scm"...
32 aaa
33 (+ 1 2 3)
34 +
35 (1 2 3)
36 
37 bbb
38 ;... done
39 ;Value: ok
40 
41 1 ]=> 

L6 輸入 ('a), read 回傳一個 list 包含 'a 和 ()。 
L18 輸入 'Z, read 回傳一個 list 包含 quote 和 Z。
L33, 輸入 (+ 1 2 3) read 會傳回一個 list 包含了 + 這個 symbol, 還有 1, 2, 3。


沒有留言:

張貼留言

使用 google 的 reCAPTCHA 驗證碼, 總算可以輕鬆留言了。

我實在受不了 spam 了, 又不想讓大家的眼睛花掉, 只好放棄匿名留言。這是沒辦法中的辦法了。留言的朋友需要有 google 帳號。