作者Schelfaniel (Schelfaniel)
看板Ruby
标题Re: [连结] 松本行弘: Code 的世界~成为超级程式设 …
时间Mon Jul 27 16:17:54 2009
※ 引述《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