我认为以下Rebol 3代码:
x: [newline 1 2]
y: [
1 2]
print x
print new-line? x
print y
print new-line? y
Run Code Online (Sandbox Code Playgroud)
应该输出:
<empty line>
1 2
true
<empty line>
1 2
true
Run Code Online (Sandbox Code Playgroud)
但输出的是:
<empty line>
1 2
false
1 2
true
Run Code Online (Sandbox Code Playgroud)
两个块在缩小时应该产生换行符后跟'1'和'2',因此,IMO应该相同地打印.不太清楚是否新线?在两个块上也应该给出相同的结果,因为newline关键字应该等同于这种测试的文字换行符.
DO方言使用PAREN系列!对于优先级,通常会在调用函数之前烧掉底层括号结构.
但是,Rebol 2中曾经有可能在函数的定义中指定您希望它抑制在调用点上对括号的评估.您通过在参数上使用"文字单词"撇号来完成此操作:
evaluated: func [param] [probe param]
non-evaluated: func ['param] [probe param]
>> evaluated (1 + 2)
3
>> non-evaluated (1 + 2)
(1 + 2)
Run Code Online (Sandbox Code Playgroud)
所以你通过了系列!分类型,类PAREN的......在这种情况下,与内部的三个标志性元素:1,+,2.这在Rebol 3中不起作用:
>> non-evaluated (1 + 2)
3
Run Code Online (Sandbox Code Playgroud)
这是一个错误还是一个有目的的设计决定?有解决方法吗?请注意,将引号操作符放在callsite上是行不通的,因为它是quote引用的符号词,然后是paren!得到自己的评估,成为表达式的最终值: - /
>> non-evaluated quote (1 + 2)
quote
== 3
Run Code Online (Sandbox Code Playgroud) 此代码返回-1R3和+1R2.我想知道我做错了什么.
f: func [] [
also return 1
return -1
]
f
Run Code Online (Sandbox Code Playgroud) 做任何的REBOL 3大师在这里知道为什么modified?,exists?和size?功能定位一个URL时,R3上的失败?
这些函数适用于本地文件.
我对R2非常熟悉,但有时R3的行为似乎很奇怪.我正在使用从2012年12月12日开源版本编译的股票代码,并且我正在Windows 7上运行.
我在Windows下将Rebol3复制到我的电脑上.我从下载而不是完整安装运行它,它似乎没问题.
我尝试在控制台中使用一些非常简单的GUI示例代码,但它失败并出现各种错误消息.
如果我view [输入并输入enter它告诉我它的语法错误(这在reb / view 2中有效).
它是一台胜利的7机器.
Rebol3的版本是2014-03-04 04:54
当我使用help并输入命令时what,view未列为命令.
在rebol中我写了这个非常简单的函数:
make-password: func[Length] [
chars: "QWERTYUIOPASDFGHJKLZXCVBNM1234567890"
password: ""
loop Length [append password (pick chars random Length)]
password
]
Run Code Online (Sandbox Code Playgroud)
当我连续多次运行时,事情变得非常混乱:
loop 5 [print make-password 5]
Run Code Online (Sandbox Code Playgroud)
给(例如)此输出:
看起来这个函数记住了过去的执行并存储了结果而不是再次使用它!
我没问过这个!
我希望输出类似于以下内容:
我怎样才能达到这个效果?
我使用的是Rebol 2.7.8.3.1.我试图逃避@我的网址中的符号,但它无法正常工作.我也试过手动转义它,但这也不起作用.
我尝试过以下方法:
read ftp://mydomain:12345/path/to/@folderA
read ftp://mydomain:12345/path/to/%40folderA
Run Code Online (Sandbox Code Playgroud)
如果我有一个文件夹,folderB(@路径中没有),它可以正常工作:
read ftp://mydomain:12345/path/to/folderB
Run Code Online (Sandbox Code Playgroud)
我也尝试将url写成一个字符串,既没有转义也没有,然后使用to-url,但它给出了类似的结果.
使用decode-url,似乎Rebol在我的所有情况下都错误地解释了url.
如何在Rebol中转义网址?
问题是解析一个通过加载/标记获得的html流,你可以获得html标签组成部分,即当你找到
<div id="one">my text</div>
Run Code Online (Sandbox Code Playgroud)
你应该在同一个容器中以<div id ="one">,{my text}和</ div>之类的东西结尾,类似于
[<div id="one"> {my text} </div>]
Run Code Online (Sandbox Code Playgroud)
甚至更好
[<div> [id {one}] {my text} </div>]
Run Code Online (Sandbox Code Playgroud)
解析问题是匹配成对的html标签,在html中,标签可能是一个空标签,可能属性但没有内容,因此没有结束标签或普通标签可能带有属性和内容,因此是结束标签,但两种类型的标签只是一个标签
我的意思是当你找到一个像<p>一些单词的序列</ p>你有一个P标签时,你会得到一个像<p />这样的序列只是一个P标签,在第一种情况下你有关联的文字和结束标签在后者你没有,这就是全部
换句话说,html属性和内容是html中tag元素的属性,所以在json中表示这一点你会得到像:
tag: { name: "div" attributes: { id: "one } content: "my text" }
Run Code Online (Sandbox Code Playgroud)
这意味着你必须识别标签的内容,以便将其分配给正确的标签,就rebol解析而言,这意味着标识匹配的标签(打开标签和结束标签)
在rebol中,您可以轻松解析html序列,如:
<div id="yo">yeah!</div><br/>
Run Code Online (Sandbox Code Playgroud)
规则:
[ some [ tag! string! tag! | tag! ]]
Run Code Online (Sandbox Code Playgroud)
但是使用此规则,您将匹配html
<div id="yo">yeah!</div><br/>
Run Code Online (Sandbox Code Playgroud)
并且
<div id="yo">yeah!</p><br/>
Run Code Online (Sandbox Code Playgroud)
同样的
所以你需要一种方法来匹配相同的开始标记出现在结束位置
遗憾的是,rebol标签不能(AFAIK)使用标签名称进行参数化,所以你不能说:
[ some [ set t1 tag! set s string! set t2 tag!#t1/1 | tag! ] ]
Run Code Online (Sandbox Code Playgroud)
t1/1表示法归因于rebol的(坏)特征,包括标记名称相同级别的所有标记属性(另一个不良特征是不将匹配标记重新识别为相同的标记)
当然,您可以使用以下代码实现目标: …
我试图看看我是否可以使用Red(或Rebol)来实现一个简单的DSL.我想将我的DSL编译为另一种语言的源代码,可能是Red或C#或两者 - 而不是直接解释和执行它.
DSL只有几个简单的语句,加上一个if/else语句.语句可以分为规则.规则将被转换为函数定义,每个语句都是目标语言中的等效语句.
Red/Rebol中的解析功能很棒,让我可以非常轻松地实现解析器 - 实际上它基本上只是语法本身的定义.
但是,我无法找到如何采取后续步骤的任何示例,特别是处理if语句并将其转换为其他源代码.翻译if语句似乎是一个很小的例子,但仍然有点棘手 - 因为在Red中有一个else意味着你需要将if改为其中一个,而不仅仅是一个额外的可选else.
传统上,在解析期间,我将构建一个抽象语法树,然后具有在AST上操作并生成新源代码的函数.我应该遵循同样的方法还是在Red中还有其他一些更惯用的方法?
我已经尝试在我的解析规则中使用collect/keep来返回嵌套块的块,这实际上形成了AST.另一种方法是将数据保存到表示不同语句等的特定对象中.
我仍然要处理收集/保留,以及何时创建新块以及将保留什么.我还想让我的解析器规则尽可能"干净",其中很少有其他代码交织在一起.所以我仍然不确定如何在解析规则的圆括号中添加红色代码.即使规则最终失败,过早添加代码也会导致Red代码被执行.添加代码太晚意味着代码可能无法按照您期望的顺序执行,尤其是在处理多级语句(如if,可能包含其他语句)时.
因此,特别是,如何将我的示例DSL转换为红色源代码的任何帮助将不胜感激.在Red或Rebol中实现这样的DSL的任何链接都会很棒!:)
这是我的解析规则: -
Red [
Purpose: example rules for parsing a simple language
]
SimpleLanguageParser: make object! [
Expr: [string! | integer! | block!]
Data: ['Person.AGE | 'Person.INCOME]
WriteMessageToLog: ['write 'message 'to 'log Expr]
SetData: ['set 'data Data '= Expr]
IfStatement: ['if Expr [any Statement] opt ['else [any Statement]] 'endif]
Statement: [WriteMessageToLog | SetData | IfStatement]
Rule: [
'rule word!
[any Statement]
'endrule
]
AnySimpLeLanguage: [Rule | …Run Code Online (Sandbox Code Playgroud)