2013-01-16 248 views
1

我試圖讓地圖運營商對他們的對立面在雷博爾2,例如:與SELECT和<= and > =運營商,怪異的行爲返回垃圾或無

op-map: [ 
    >= [<] 
    <= [>] 
] 

這並不適用於<=工作:

>> select op-map to-word "<=" 
== none ;-- expected [>] 

,並給出了>=一個很奇怪的反應:

>> select op-map to-word ">=" 
== [<] 
    <= [>] ;-- expected just [<] 

這在Rebol 3中正確運行。它是一個錯誤嗎?如何解決這個問題?

回答

0

看起來是Rebol 2解析邏輯中的一個錯誤。它看到第一個<,然後開始解釋隨後的輸入,就好像它是一個TAG!鍵入(如在HTML標籤中),直至找到結尾>。注意這一點:

>> length? op-map 
== 2 

>> op-map/2/1 
== <] 
    <= [> 

>> type? op-map/2/1 
== tag! 

所以要雷博爾的2頭腦,這是類似於如果你這樣寫的線沿線的東西更多:

op-map: [ 
    >= [<a href="http://hostilefork.com">] 
] 

而且它不只是蓋帽!有這個問題,它發生在PAREN!太:

>> op-map: first [(>= (<) <= (>))] 
== (>= (<) <= (>)) 

>> length? op-map 
== 2 

我不完全知道什麼是規則是正在在雷博爾3.這項工作它不禁止的標籤括號內:

>> print <[o]> 
== <[o]> 

...但你不能使用源無與倫比的結束括號,同時打開那些被容忍:

>> print <]> 
** Syntax error: missing "[" at "end-of-block" 
** Near: (line 1) print <]> 

>> print <[> 
<[> 

...但你可以用無與倫比的閉幕者,當他們引號內:

>> print <"]"> 
<"]"> 

更奇怪的是,你可以創建只包含一個無與倫比的封閉編程括號標記:

>> print to-tag "]" 
<]> 

因此,儘管它看起來有中給出的那種情況下更好的行爲,這是很難說,如果有在「修復」方面,它確實是一個形式化的邏輯。新規則可能有類似但更微妙的一類問題。在此期間,爲安全起見,在雷博爾2中,這些運營商打交道時,你可以嘗試從字符串創建它們:

op-map: compose/deep [ 
    (to-word ">=") [(to-word "<")] 
    (to-word "<=") [(to-word ">")] 
] 

它更詳細。但是,字符串分隔符的存在將阻止解析器嘗試將<>解釋爲標記分隔符。

2

添加空格 - 使用<>由於標籤中的雙重用途(如您所建議的)而成爲特殊情況。與常規使用例如3 < 4,把一個空間<後,將防止從一個標籤混淆它的解析器和治療爲一個字:

op-map: [ 
    >= [< ] 
    <= [>] 
] 
+0

嗯...好吧,但這不是很自我記錄。絕對看起來像某人會進去,只是刪除,如果你沒有留下嚴厲的評論。 :-(希望這將得到更加統一的理解! – HostileFork

+0

那麼,正如你所建議的那樣 - 它在R3中正常工作,所以它已經被理順了,除非它有2.7.9 ... – rgchris