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

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