Re: [連結] 松本行弘: Code 的世界~成為超級程式設 …
※ 引述《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
討論串 (同標題文章)
Ruby 近期熱門文章
PTT數位生活區 即時熱門文章