2009-12-16 62 views
0

我想這樣做:如何編寫與Set(編程)一起使用的Rebol代碼塊?

>> SET [a b] reduce [(ask "a: ") (ask "b: ")] 
a: 1 
b: 2 
== ["1" "2"] 
>> 

編程:

args: [a b] 
block: copy [] 
foreach arg args [ 
    append block to-word "(" 
    append block 'ask 
    append block rejoin [arg ": "] 
    append block to-word ")" 
] 
set args reduce block 

但我得到這個錯誤:

>>  foreach arg args [ 
[   append block to-word "(" 
[   append block 'ask 
[   append block rejoin [arg ": "] 
[   append block to-word ")" 
[  ] 
== [(ask "a: ") (ask "b: ")] 
>> set args reduce block 
** Script Error: (has no value 
** Near: (ask "a: ") (
>> 
+0

有人嗎?這是太難了:) – 2009-12-17 23:24:41

回答

1

什麼你已經發現是括號不word!秒。它們內置於Rebol中,解析器確保它們與—相匹配,就像block!一樣。

這是一件好事—否則在系統周圍將是代碼處理()))()不匹配。你已經從這種痛苦中解救出來了!但是,如果你想要的話,你可以用自己的方言重塑這種痛苦,並使用BEGIN和END等詞語,而不是利用有益的paren!。 :P

這裏有一個最低限度的補丁代碼:

args: [a b] 
block: copy [] 
foreach arg args [ 
    p: to-paren [] 
    append/only block p 
    append p 'ask 
    append p rejoin [arg ": "] 
] 
set args reduce block 

注意,你可以不寫copy()。一般來說,在do方言中使用括號有點複雜,它們的優先級是服務雙重責任的塊—!解釋者認爲copy()意味着您正在嘗試對要複製的結果的表達式加上括號。

>> to-paren [ask "a: "] 
== (ask "a: ") 

PS我不想通過指出從你的問題來轉移::(

您可以通過構建東西塊,然後只在最後一分鐘將它們保存自己有些頭痛該括號實際上不是必要的:

>> SET [a b] reduce [ask "a: " ask "b: "] 

但有關的好消息是,如果你願意讓括號在這種情況下,服務於「更高的目標」,總有compose

args: [a b] 
block: copy [] 
foreach arg args [ 
    append block compose [ask (rejoin [arg ": "])] 
] 
set args reduce block 

構圖就像使用「模板方言」,它只會減少包含在包件中的表達式,而保留其他所有內容。這是通過示例創建代碼的好方法,但如果生成的代碼已經使用了括號,那麼肯定會遇到麻煩!仍然...表明你的方言可以用於任何目的的括號,就像他們可以賦予詞語的含義一樣。

+0

非常感謝!!!!!!!!!!你在未來保存我的一天和其他許多人:) – 2009-12-18 12:34:07

+0

我知道parens沒有必要,這只是我想明白爲什麼它不起作用;) – 2009-12-18 12:40:18