2011-03-07 24 views
0

我已經開始關注REBOL,只是爲了好玩,作爲編程語言的粉絲,我非常喜歡看到新的想法,甚至只是替代語法。 REBOL絕對是這些。我注意到的一件事是使用'/'作爲路徑運算符,它可以類似於'。'使用。操作符在大多數面向對象的編程語言中。我沒有廣泛地使用REBOL進行編程,只是看了一些例子並閱讀了一些文檔,但是我不清楚爲什麼'/'操作符沒有含糊之處。REBOL路徑運算符與分歧模糊

x: 4 
y: 2 
result: x/y 

在我的例子,這應該是分裂的,但它似乎是它可以很容易地是路徑操作,如果x是一個對象或功能細化。 REBOL如何處理歧義?這只是一個重載操作符和類型系統的問題,所以它直到運行時才知道?或者是我在語法中缺少的東西,真的有區別?

UPDATE實測值良好的片的示例代碼:

sp: to-integer (100 * 2 * length? buf)/d/3/1024/1024 

似乎算術除法需要的空白,而操作者路徑不需要空格。是嗎?

+0

*「我真的很喜歡看到新的想法,甚至只是替代語法,REBOL肯定是充滿了這些。」* - 在這裏說真話。 :-)如果您仍然對這個主題感興趣,請隨時加入我們的[StackOverflow Rebol聊天室](http://chat.stackoverflow.com/rooms/291/),它已經以開源形式發佈! – HostileFork 2013-01-25 18:17:19

回答

2

的代碼引導說:

白空間通常用於限定(用於分離符號)。

這是特別重要的,因爲單詞可能包含字符如+和 - 。

http://www.rebol.com/r3/docs/guide/code-syntax.html

的是一個REBOler一個獲得的技能是獲得表達式插入空格的竅門,而其他語言通常不要求它:)

+0

啊,謝謝。我在看的教程中沒有看到它,但是,是的,這顯然是發生了什麼。 – 2011-03-08 13:23:28

+0

出於好奇,你是否覺得這很煩人,或者不是什麼大不了的事? – 2011-03-08 13:24:55

+0

我不完全相信命名單詞的寬鬆規則是表達式中強制性額外空格的良好折衷......但是它很容易記住。 – Sunanda 2011-03-08 14:38:57

0

雖然我沒有找到任何書面的明確說明,但我也發現+, - ,*和其他字符是一個有效的字符,很顯然它需要一個空格。

x*y 

是一個有效的標識符

x * y 

執行乘法。它看起來像路徑運算符只是另一個例子。

3

這個問題從值得回答句法的觀點。實際上,在Rebol中,沒有「路徑運算符」。 x/y是一個稱爲path的語法元素。與單獨的/(用空格分隔)不是路徑相反,它是一個單詞(它通常被解釋爲除法運算符)。在雷博爾您可以檢查語法元素是這樣的:

length? code: [x/y x/y] ; == 4 
type? first code ; == path! 
type? second code 

等通常需要在雷博爾

2

空間,但在這裏和那裏也有例外的「特」字,如劃定系列。例如:

  • [a b c]相同[ a b c ]
  • (a b c)相同(a b c)
  • [a b c]def相同[a b c] def

一些相當強大的工具,做語法元素的反思type?,quoteprobe。引用操作符可以防止解釋器對事物給出行爲。所以,如果你想是這樣:

>> data: [x [y 10]] 
>> type? data/x/y 
>> probe data/x/y 

代碼的「活」性將通過路徑挖掘,給你的價值10integer!。但是如果你使用報價:

>> data: [x [y 10]] 
>> type? quote data/x/y 
>> probe quote data/x/y 

然後你風與path!,其值就是data/x/y,它永遠不會被評估。

在內部表示中,PATH!與BLOCK非常相似!或者PAREN !.它只是有這種特殊的獨特的詞彙類型,這使得它可以被區別對待。儘管你已經注意到它可以通過從一個對象或系列中選出成員來表現得像一個「點」,但這只是DO方言使用它的方式。你可以創造自己的想法,讓我們說你做「羅素」命令:

russell [ 
    x: 10 
    y: 20 
    z: 30 
    x/y/z 
    (
     print x 
     print y 
     print z 
    ) 
] 

試想一下,在我的奇特的例子,這個輸出301020 ...因爲什麼羅素函數的作用是評估其以這種方式阻止路徑被視爲移位值的指令。所以x/y/z表示x => y,y => z,並且z => x。然後括號中的任何代碼都在DO方言中運行。分配正常處理。

如果您想爲如何表達自己做一個有趣的新即興表演,Rebol會處理很多煩瑣的工作。因此,例如括號保證匹配達到paren!。你不必自己去尋找所有的東西,你只需從所有這些不同類型的構建塊中構建你的方言......並且與現有的行爲掛鉤(比如數學和一般計算等基礎知識的DO方言,以及一些令人驚歎的模式匹配肌肉的彎曲PARSE方言)。

但是,「所有這些不同的類型」的講話,還有卻爲斜線另一個怪人情況,可以創建另一個類型:

>> type? quote /foo 

這就是所謂的refinement!,以及發生在你開始詞法元素用斜線。你會看到它在DO方言中使用,爲可選參數集調用一個函數。但再一次,這只是另一個符號樂高在零件盒。你可以用你自己的方言來描述它的意思,這是完全不同的......