gpt4 book ai didi

rebol - 是否可以在纯 REBOL 中实现 DO + 功能?

转载 作者:行者123 更新时间:2023-12-01 00:56:18 26 4
gpt4 key购买 nike

DO后跟一个函数,该函数被执行,其余的值根据给定函数的数量作为参数使用,例如,

do :multiply 3 4
multiply 3 4

这两个语句的效果是相同的。但我认为 DO + 函数受到 REBOL 解释器的特殊处理,因为我认为不可能实现您自己的 DO (具有完全相同的语法)在纯 REBOL 中,例如,
perform: func [f [any-function!]] [
; What goes here?
]

这样对吗?

澄清

我是 不是 询问 DO方言。这不是一个“初学者”的问题。我非常非常了解 REBOL 的一般语法: Bindology (我在上面写的一篇旧博客文章),它的同音性的含义,单词的各种风格,以及所有其他的。 (例如, here 是我在 REBOL 中对 Logo 的 cascade 的实现。当我在做时,为什么不将我的 Vim syntax plug-in 插入 REBOL。)

我在问一些更微妙的事情。我不知道如何比我已经拥有的更清楚地表达它,所以我会请你更仔细地阅读我原来的问题。我想实现一个功能,比如 DO , 具有以下能力:
do :multiply 3 4
double: func [n] [n * 2]
do :double 5

注意语法 do :doubledo :multiply在它之后消耗适当数量的 REBOL 值。这是理解我在问什么的关键。据我所知,不可能编写自己的 REBOL 函数来 DO这个。

当您可以用纯 REBOL 编写自己的函数来替代 DO 时,您就已经回答了这个问题。在上面的例子中——没有方言、块或任何其他修改——或者解释为什么不能这样做。

最佳答案

您所看到的行为的具体原因是 this line of code用于 Rebol 原生 .

/***********************************************************************
**
*/ REBNATIVE(do)
/*
***********************************************************************/
{
REBVAL *value = D_ARG(1);

switch (VAL_TYPE(value)) {

/* ... */

case REB_NATIVE:
case REB_ACTION:
case REB_COMMAND:
case REB_REBCODE:
case REB_OP:
case REB_CLOSURE:
case REB_FUNCTION:
VAL_SET_OPT(value, OPTS_REVAL); /* <-- that */
return R_ARG1;

此 OPTS_REVAL 可在 sys-value.h 中找到,你会在那里找到一些其他特殊的控制位......比如隐藏的“换行符”标志:
// Value option flags:
enum {
OPTS_LINE = 0, // Line break occurs before this value
OPTS_LOCK, // Lock word from modification
OPTS_REVAL, // Reevaluate result value
OPTS_UNWORD, // Not a normal word
OPTS_TEMP, // Temporary flag - variety of uses
OPTS_HIDE, // Hide the word
};

所以 DO 原生处理函数的方式是返回一种“激活”的函数值。但是您不能使用在用户代码中设置的此标志来创建自己的值。整个代码库中唯一设置标志的地方是 DO 原生中的这个片段。

它看起来像是可以给斧头的东西,因为 APPLY 更干净地并且在系统的定义范围内。

关于rebol - 是否可以在纯 REBOL 中实现 DO + 功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27631895/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com