作者Schelfaniel (Schelfaniel)
看板Ruby
标题Re: [连结] 松本行弘: Code 的世界~成为超级程式设 …
时间Mon Jul 27 22:14:06 2009
※ 引述《godfat (godfat 真常)》之铭言:
: 有需要这麽复杂吗..? 试了一下,这样也行:
这是从网页上抄的,我一字未改 :QQ
: (defmacro square-sum2 (x y)
: (let ((sum (gensym "SUM-")))
: `(let* ((,sum (+ ,x ,y)))
: (* ,sum ,sum))))
这个写法应该没什咩问题,
原本它把 x y 重新 bind 应该是习惯,
这样比较安全。
: 甚至连 sum 也拿掉也行:
: (defmacro square-sum2 (x y)
: `(let* ((sum (+ ,x ,y)))
: (* sum sum)))
唔,这样写也没问题,而且这样就不用 let* 了,直接 let 就好了 :QQ
这是刚好这例子没有副作用啦,
我猜是那作者已经习惯那样重新 let 一次以策安全的。
: : 不过 Common Lisp 可以自订 Reader Macro,也就是说
: 下略,看不太懂 @@
总之就是改变 Reader 的型态啦。
像
Common Lisp 的 正常语法是 (print (+ 1 2))
Reader Macro 可以做到 (println #I[1+2+3+4+5])
之前还看过内含 ASM 语法的 :QQ
假设如下
#A(
mov ax, 10h
ret
)
这些是怎麽处理的?? 是因为它可以设定它的 Reader 在读取时,
碰到 #A 时,会呼叫对应的函式去解释中间的语法,把它编为 Lisp 的格式,
也就是说,要写一个 #R( ) 中间是夹 Ruby 语法也不是不可能的。
: 我的疑问是,反正 ruby 有 eval, 这样有什麽做不出来吗?
: def sum_square2 x, y
: eval "a = #{x} + #{y}; a * a"
: end
: 这跟上面的 lisp 有何不同?
这个是 Function 不是 Macro 呀,
Macro 比较像 inline 或 #define 也,如果又 Function 又 Eval,
不就达不到原本 Macro 要求的速度性了??
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 114.32.74.159