Documentation 记录Rebol&x27;s方言

Documentation 记录Rebol&x27;s方言,documentation,rebol,Documentation,Rebol,我可以这样记录一个函数: f: func [ "a description" arg1 [string!] "a description of an argument 1" ][ arg1 ] 我可以使用?/帮助来检索有关函数的信息(描述、用法、参数列表、每个参数的描述及其类型) 我无法记录像这样的方言。是否有自动记录方言的方法(如funcdoes)?我必须手动完成吗?目前没有相关内容,但这是个好主意。太好了,以至于之前。:-) 我必须手动执行此操作吗

我可以这样记录一个函数:

f: func [
    "a description"
    arg1 [string!] "a description of an argument 1"
    ][
    arg1
    ]
我可以使用
/
帮助
来检索有关函数的信息(描述、用法、参数列表、每个参数的描述及其类型)


我无法记录像这样的方言。是否有自动记录方言的方法(如
func
does)?我必须手动完成吗?

目前没有相关内容,但这是个好主意。太好了,以至于之前。:-)

我必须手动执行此操作吗

您可以手动编写一个定义“方言规范”格式的新生成器。然后,要么给它一个HELP命令,要么扩展HELP来识别它

这是一个非常简短的示例,演示了一组在执行类似操作时可能会派上用场的技术(并非所有技术都是显而易见的,而是暗示了灵活性):

所以这里有一个函数,它接受方言规范并生成一个函数。一旦您拥有了发电机,使用它可以减少手动操作:

mumble: make-dialect [keywords: [foo baz bar]] [
    print ["arg is" mold arg]
]

>> mumble help
foo - your help here
baz - your help here
bar - your help here

>> mumble [<some> [dialect] {stuff}]
arg is [<some> [dialect] {stuff}]
mumble:make方言[关键词:[foo baz bar]][
打印[“参数为”模具参数]
]
>>咕哝救命
福-你的帮助
你的帮助
酒吧-你的帮助在这里
>>咕哝[方言]{stuff}]
arg是[[方言]{stuff}]
这里使用的技术有:

  • 软引用-通常您必须说
    mumble'help
    才能将帮助作为一个轻松的词“引用”!让它通过这个词!咕哝(与运行默认帮助命令相反)。但由于arg在生成的函数中声明为
    'arg
    ,因此它是“软引用的”…这意味着不会对单词和路径求值。(Parens、get words和get path仍然是。)这是一种折衷,因为这意味着如果有人想要传递变量,他们必须说:var(var)作为参数,而不仅仅是
    var
    (想象一下,如果传递方言的块在变量中)所以你不一定想使用它……但我认为它是一个有趣的演示,让
    mumble help
    在没有文字的情况下工作

  • 深度合成-传递给
    make dialogue
    spec
    body
    变量仅在
    make dialogue
    运行时存在。一旦结束,他们就会消失。所以你不能把这些词留在你正在生成的函数体中。这使用COMPOSE/DEEP在函数生成器运行前评估函数体中的参数以生成结果,有效地提取块的数据并将其缝合到函数体结构中

  • 重用函数的绑定工作-生成的函数有一个带有参数
    arg
    的规范,该参数在
    makedialent
    的调用站点中不存在。所以arg必须反弹到某个位置,但是什么呢?手动操作是可能的,但一个简单的方法是让FUNC为您完成这项工作

这些是提议的解决方案中使用的一些技术,该解决方案不仅试图记录方言,而且提供了一种简单的方法,通过这种方法可以重新映射它们的关键字(例如,如果一个人的Rebol系统已配置为另一种口语)

make-dialect: function [spec [block!] body [block!]] [
    return function ['arg [block! word!]] compose/deep/only [
        case [
            arg = 'HELP [
                foreach keyword (spec/keywords) [
                    print [keyword "-" {your help here}]
                ]
            ]

            block? arg [
                do func [arg] (body) arg
            ]

            'default [
                print "Unrecognized command.  Try HELP."
            ]
        ]
    ]
]
mumble: make-dialect [keywords: [foo baz bar]] [
    print ["arg is" mold arg]
]

>> mumble help
foo - your help here
baz - your help here
bar - your help here

>> mumble [<some> [dialect] {stuff}]
arg is [<some> [dialect] {stuff}]