从REBOL /核心用户指南和什么是红色,我了解到Rebol和Red都使用了定义范围.
从指南中,我知道它是静态作用域的一种形式,"变量的作用域在定义其上下文时确定",也称为运行时词法作用域,并且是依赖于上下文定义的动态形式的静态作用域..
我知道在com-sci中,有两种形式的范围:词法范围(静态范围)和动态范围.这个定义范围使我困惑.
那么什么是定义范围?
我有兴趣搜索很多长串,尝试在rebol中破解类似sed的实用程序作为学习练习.作为一个婴儿步骤,我决定寻找一个角色:
>> STR: "abcdefghijklmopqrz"
>> pos: index? find STR "z"
== 18
>> pos
== 18
Run Code Online (Sandbox Code Playgroud)
大!我们来寻找其他东西......
>> pos: index? find STR "n"
** Script Error: index? expected series argument of type: series port
** Where: halt-view
** Near: pos: index? find STR "n"
>> pos
== 18
Run Code Online (Sandbox Code Playgroud)
什么?:-(
是的,我正在搜索的字符串中没有"n".但是解释器爆炸而不是做一些明智的事情有什么好处,例如在pos中返回一个可测试的"null"字符?
我被告知我应该这样做:
>> if found? find STR "z" [pos: index? find STR "z"]
== 18
>> if found? find STR "n" [pos: index? find STR "n"]
== none
>> pos
== …Run Code Online (Sandbox Code Playgroud) 我想为一些Windows应用程序编写一个插件,它必须是一个DLL.我真的很想尝试红色和红色/系统混合.但是在SO上询问Rebol&Red聊天室时,我对红色和红色/系统,红色/系统目前是否可能有不同的反应.什么是明确的答案?
这是我想用Red实现的Lisp代码优化模式:
(defmacro compute-at-compile (x)
`(+ ,(* pi 2) ,x))
(macroexpand '(compute-at-compile 1))
; => (+ 6.283185307179586 1)
Run Code Online (Sandbox Code Playgroud)
我怎么用红色表达这个?(我意识到在今天的实现中可能无法实现,我想知道如何在语言级别表达代码以获得这样的优化.它是否需要源代码中的特殊标记,还是像Lisp一样自动化? )
我正在阅读Bindology并试过这个:
>> type? first ['x]
== lit-word!
>> type? 'x
== word!
Run Code Online (Sandbox Code Playgroud)
我预计也会type? 'x回来lit-word!.欣赏任何见解.
不同的Rebol 3分支之间有什么区别,特别是新的REN分支?
它们是运行的平台,功能集,代码组织,C标准合规性吗?
我在Google和Stackoverflow上搜索了很多.我找不到如何从网页获取Cookies(或一般来说,HTTP标题),然后编辑并发送回去?
[我知道如何使用读/写进行POST/GET请求,但Cookie idk]
我刚刚开始使用Red,我需要帮助才能使cURL绑定工作.
来自主要红灯网站的cURL链接将带您到这里
http://red.esperconsultancy.nl/Red-cURL/dir?ci=tip
但是只有一个使用Red/System的小例子,因此我不确定如何直接加载Red中的绑定.
我需要在Mac,Linux和Windows上使用它,所以我希望能够指出这些平台之间的差异.
我试图看看我是否可以使用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) 有时候,我倾向于next next a(反复地)去做一个特定的元素.当您需要2个或更少的遍历时,这很有效.但是,很快就会变得很麻烦.对于这个简单的情况,循环开销太大.
幸运的是at series pos,如果你知道这个位置,你可以做某些事情.
当谈到删除反向功能的冗余时,也就是说back,这不起作用.
最好是,我想做类似的事情at,但相对于系列中的当前位置