Rebol 中的“reword”功能是什么以及如何使用它?

2024-03-17

我看到有人提到reword今天可以使用,但是它的文档非常简短。它看起来像 shell 脚本环境变量替换,或者可能是正则表达式替换,但有所不同。我该如何使用这个功能以及我会遇到什么样的问题?


这里有龙!

The rewordfunction 是一个实验,旨在以符合我们做事方式的方式向 Rebol 添加 shell 风格的字符串插值。与 Rebol 的许多系列函数不同,它确实针对仅处理字符串类型进行了优化,设计也反映了这一点。当前版本是一个设计原型,最终将作为原生版本重做,但它确实按照设计工作,因此讨论它的工作原理和使用方法是有意义的。

什么是reword do?

基本上是这样的:

>> reword "$a is $b." [a "This" b "that"]
== "This is that."

它采用模板字符串,搜索转义序列,并将其替换为相应的替换值。这些值也以对象、映射或键和值块的形式传递给函数。键几乎可以是任何东西,甚至数字:

>> reword "$1 is $2." [1 "This" 2 "that"]
== "This is that."

如果键还不是字符串,则它们将转换为字符串。如果键被转换为相同的字符串,则它们被认为是相同的,当您执行以下操作时会发生这种情况:

>> reword "A $a is $a." [a "fox" "a" "brown"]
== "A brown is brown."

它不像正则表达式替换那样是位置性的,而是基于关键字的。如果您在值块中多次指定一个键,则该键的最后一个值就是被使用的值,正如我们刚刚看到的那样。任何未设置或无值都会被跳过,因为这些值在将内容放入字符串时没有任何意义。

您也可以使用其他转义标志,甚至是多字符标志:

>> reword/escape "A %%a is %%b." [a "fox" b "brown"] "%%"
== "A fox is brown."

或者甚至根本没有转义标志,它会在所有地方替换密钥:

>> reword/escape "I am answering you." [I "Brian" am "is" you "Adrian"] none
== "Brian is answerBrianng Adrian."

哎呀,那没用。这是因为键不区分大小写,并且它们不需要被空格或其他此类分隔符包围。但是,如果将它们指定为字符串,则可以在键本身中添加空格,这样效果更好:

>> reword/escape "I am answering you." ["I am" "Brian is" you "Adrian"] none
== "Brian is answering Adrian."

仍然在做reword没有转义字符的模板往往很棘手并且速度有点慢,因此不经常这样做。

不过,还有一个更好的技巧......

功能替换

Where reword真正有趣的是当您使用函数作为替换值时,因为该函数得到called每一次改写。假设您想用计数器替换:

>> reword "$x then $x and $x, also $x" object [y: 1 x: does [++ y]]
== "1 then 2 and 3, also 4"

或者甚至是位置,因为它可以将字符串位置作为参数:

>> reword "$x then $x and $x, also $x" object [x: func [s] [index? s]]
== "1 then 9 and 16, also 25"

等等,这看起来不太对劲,那些数字似乎不对劲。这是因为该函数返回的索引template字符串,而不是result细绳。在编写这些函数时最好记住这一点。该功能甚至不必只分配给一个键,它可以检测或使用它:

>> reword "$x or $y" object [x: y: func [s] [ajoin ["(it's " copy/part s 2 ")"]]]
== "(it's $x) or (it's $y)"

请参阅模板变量、转义符等等。并且该函数可能会产生副作用,例如这个行计数器:

>> reword/escape "Hello^/There^/nl" use [x] [x: 0 map reduce ["^/" does [++ x "^/"] "nl" does [x]]] ""
== "Hello^/There^/2"

它甚至还带有/into选项,因此您可以使用它来分阶段构建字符串。

但对于来自内置插值语言的人来说,最大的问题是……

为什么要使用值块,为什么不像普通语言那样使用变量呢?

Because Rebol 并不是这样工作的。 Rebol 没有词法绑定,它会做其他事情,因此在字符串中,如果不说出来,就无法知道从哪里获取变量的值。在其中一种具有插值功能的 shell 语言中,这相当于必须将对整个环境的引用传递给插值函数。但是,嘿,我们可以在 Rebol 中做到这一点:

>> use [x] [x: func [s] [index? s] reword "$x then $x and $x, also $x" bind? 'x]
== "1 then 9 and 16, also 25"

That bind?方法将工作在use、绑定循环和函数。如果你在一个对象中,你也可以使用self:

>> o: object [x: func [s] [index? s] y: func [s] [reword s self]]
== make object! [
    x: make function! [[s][index? s]]
    y: make function! [[s][reword s self]]
]
>> o/y "$x then $x and $x, also $x"
== "1 then 9 and 16, also 25"

但要小心,否则你最终可能会做这样的事情:

>> o/y "$x then $x and $x, also $x, finally $y"
** Internal error: stack overflow

龙!这是将变量和替换键分开的一个很好的理由......

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Rebol 中的“reword”功能是什么以及如何使用它? 的相关文章

随机推荐

  • 使用XML关联子节点和父节点的值

    使用 R 的 XML 包时 如何保留与该节点关联的某个节点的数据 例如在同一个列表中 我正在尝试将从网络上抓取的数据放入数据框中 并将相关信息分组为行 有 span 没有类属性来区分的元素 可能有一个或两个 span 位于每个相关组 数据框
  • python beautifulsoup new_tag:将类指定为属性

    我对 python 和 beautifulsoup 都很陌生 所以也许我找不到一个简单的答案 当我打电话时 new tag name 我还可以分配属性 例如 new tag a href id link1 但我不能这样分配类 因为它是保留字
  • 声明 actionListener=“#{bean.method}” 时 不导航

    我正在尝试创建一个允许用户登录系统然后导航到主页的页面 我已经设法让它完成其中一项任务 但无法弄清楚如何让它同时完成两项任务 我爬遍了所有网站 但找不到合适的答案 请帮忙 我的代码如下 XHTML
  • Apache下载php文件而不是执行脚本

    我刚刚在运行 10 6 Apache2 PHP Mysql 的新 Mac 上设置了本地 Web 服务器 一切似乎都工作正常 除了当我导航到SOME 不是大多数 页面 Apache 下载 php 文件而不是执行它们 我认为这可能与 php 执
  • 布尔玛进度文本位于中间

    为什么当我使用 Bulma CSS 框架的进度时 https bulma io documentation elements progress https bulma io documentation elements progress 我
  • 无法在 MySQL Workbench 5.2.40 中创建表

    我刚刚创建了一个新架构并想要创建一个新表 当我右键单击我创建的 2myschema 并选择 新表 时 我为要创建的表指定了名称 但出现以下错误 我搜索了该错误 发现原因是我输入了保留字 例如 order 但 table2 不可能是保留字 并
  • HashSet为什么要排序? [复制]

    这个问题在这里已经有答案了 我正在学习 Java 中的容器 最近我读到 HashSet 没有按顺序给出元素 有什么有趣的Integer我随机制作的 HashSet 已排序 当我将其类型更改为Double打印的 HashSet 不再排序 我的
  • 编辑 ELF 文件中的变量值?

    我需要更改已编译的 ELF 文件中的几个变量 为了清楚地解释这一点 我将使用一个简单的 C 结构作为示例 单个源文件被编译并从 MyFile c 链接 0x1000 到 MyFile elf typedef struct uint32 t
  • DataGrid 的 CellEditingTemplate 和编辑模式下的焦点

    我在使用 WPFToolkit 时遇到问题DataGrid当定制色谱柱同时提供两者时CellTemplate and CellEditingTemplate 如果你看下面 你会看到我的编辑模板有一个CheckBox 从功能上来说一切都很好
  • Xcode 4 的隐藏功能

    Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案或互动 现在 Xcode 4 已正式发布 是时候跟进我之前的问题了 Xcode 的隐藏功能 https
  • WordPress API:添加/删除帖子上的标签

    我知道这似乎是一个简单的操作 但我找不到任何资源或文档来解释如何使用帖子 ID 以编程方式向帖子添加和删除标签 下面是我正在使用的示例 但它似乎覆盖了所有其他标签 function addTerm id tax term term id i
  • Bootstrap 3:防止模态内部的模态每次触发(hidden.bs.modal)

    我有一个模态位于另一个模态中 并且我设法使内部模态关闭而不影响另一个模态 问题是 当第二个模式关闭时 它会触发 hidden bs modal 事件本身和第一个模型
  • Android 模拟器不显示印地语字体

    我在模拟器上将语言环境更改为 hi IN 当我在模拟器上启动应用程序 甚至主屏幕 时 我看到的只是让人想起 我不知道如何渲染此字体 的框 任何关于为什么会发生这种情况以及如何消除这种情况的意见都是非常受欢迎的 我需要显示印地语字体以测试我的
  • 由于协议不匹配而阻止 iframe

    我正在尝试将值从父窗口发送到按钮上的框架click事件 但它在控制台上显示错误 未捕获的安全错误 阻止了具有来源的帧 http 本地主机 53838 http localhost 53838 访问来源为 null 的框架 请求访问的帧具有
  • 有一个用于反应本机选择器的占位符

    有没有办法在用户单击它之前显示反应本机选择器的占位符 我们的想法是有一个选择器显示 国籍 一旦您单击并选择您的国家 地区 它就会呈现该国家 地区 我想在不将 国籍 作为选择器中的可用选项的情况下执行此操作 将第一个孩子放置为
  • 在 WooCommerce 中的简短描述之前显示自定义产品字段

    在简短描述之前 我在 WooCommerce 中添加新字段时遇到问题 我在中使用了脚本functions php我的新自定义字段显示正确 但是 使用脚本时简短描述消失 新字段显示正常 我可以编辑产品页面上字段的内容 但无法删除它 它始终是最
  • Ubuntu 10.1下如何识别多个USB串口适配器

    我正在 Ubuntu 10 1 下从多个相同的 USB 串行适配器读取数据 有时 它们的 dev tty 路径会发生变化 例如 如果在启动时连接了其他 USB 设备 我需要一种通过任何此类更改重复引用同一适配器的方法 据 udevadm 称
  • XInclude 的替代方案

    据我所知没有支持XInclude在 net中 我想利用同样的机制来分层组织 XML 配置文件 我的意思是我有一个引用特定 Xml 文件的顶级 XML 配置文件 我的配置是专用于一个特定模块的一组配置 我该怎么办呢 或者也许为什么我不应该这样
  • 如何在 Azure DevOps 中为 Node.js Web 应用创建发布管道?

    我想通过创建发布管道 在 Azure DevOps 上启用 Node js 应用程序的持续部署 我怎样才能做到这一点 当我写一年前的答案时 Azure DevOps 没有用于构建管道的 Web 应用程序部署任务 因此必须使用发布管道来完成
  • Rebol 中的“reword”功能是什么以及如何使用它?

    我看到有人提到reword今天可以使用 但是它的文档非常简短 它看起来像 shell 脚本环境变量替换 或者可能是正则表达式替换 但有所不同 我该如何使用这个功能以及我会遇到什么样的问题 这里有龙 The rewordfunction 是一