Re: [連結] 松本行弘: Code 的世界~成為超級程式設 …
※ 引述《godfat (godfat 真常)》之銘言:
: 這樣的話我有同感,我是物件導向信仰者沒錯,
沒想到 godfat 是物件導向信仰者 @@
: : → Schelfaniel:日文版書一般不會太難看懂吧,碰上不行就查字典 @@ 07/27 11
: 那英文書是不是也是..? XDD
英文也是呀,至少英日對國人來說難度較低。
: : → Schelfaniel:不過它寫的 Common Lisp 的 Reader Macro 這段, 07/27 11
: 這是?有沒有什麼 reference?
Common Lisp Macro : ( 這是取自網頁 )
(defmacro square-sum2 (x y)
(let ((first (gensym "FIRST-"))
(second (gensym "SECOND-"))
(sum (gensym "SUM-")))
`(let* ((,first ,x)
(,second ,y)
(,sum (+ ,first ,second)))
(* ,sum ,sum))))
Clojure Macro : ( 這是我拿 Common Lisp 版來改的 )
(defmacro square-sum2 [x y]
`(let [first# ~x
second# ~y
sum# (+ first# second#)]
(* sum# sum#)))
Clojure 版明顯簡單許多 :QQ
不過 Common Lisp 可以自訂 Reader Macro,也就是說
原本的 (map 'vector *f* *v1* .. *vn*)
要寫成 #v(*f* *v* .. *vn*)
用上述的 Macro 是不可能達到的,
因為 Macro 再怎麼說還是 Lisp 的格式,
就需要 Reader Macro。
上述 #v 的作法如下: ( 取自網頁 )
(set-dispatch-macro-character #\# #\v #'vector-map-transformer)
(defun vector-map-transformer (stream subchar arg)
(let* ((sexp (read stream t))
(fname (car sexp))
(arguments (cdr sexp)))
`(map 'vector (function ,fname) ,@arguments)))
它是用 set-dispatch-macro 當碰到 #v 時要怎麼處理去下的
之前 Common Lisp 還看過 Infix 的 Reader Macro,
只要寫 #I[1+2] 它就會自動轉成 (+ 1 2)
該 #I 還蠻複雜的,要的話要找一下 :QQ
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 163.29.28.137
討論串 (同標題文章)
Ruby 近期熱門文章
PTT數位生活區 即時熱門文章