Re: [連結] 松本行弘: Code 的世界~成為超級程式設 …

看板Ruby作者 (Schelfaniel)時間15年前 (2009/07/27 16:17), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串3/16 (看更多)
※ 引述《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
文章代碼(AID): #1ARMApH0 (Ruby)
討論串 (同標題文章)
文章代碼(AID): #1ARMApH0 (Ruby)