Perl6:使用俚语添加印记

2023-12-24

我正在尝试添加“€”作为“$”标量的别名,我认为使用俚语来实现这一点是可行的。但 perl6.doc 根本没有提到俚语。

我已阅读以下内容:

  • https://perlgeek.de/en/article/mutable-grammar-for-perl-6 https://perlgeek.de/en/article/mutable-grammar-for-perl-6(2008年起)
  • https://mouq.github.io/slangs.html https://mouq.github.io/slangs.html

并查看了 Slang::Roman 和 Slang::Tuxic 模块。

结果是这个文件(ScalarEU.pm6):

use nqp;

unit module ScalarEU2;

sub EXPORT(|)
{
  my role Euscalar
  {
    token sigil:sym<$> { '€' | '$' }
  }

  my Mu $MAIN-grammar := nqp::atkey(%*LANG, 'MAIN');
  my $grammar := $MAIN-grammar.HOW.mixin($MAIN-grammar, Euscalar);

  $*LANG.define_slang('MAIN', $grammar, $*LANG.actions);

  {}
}

然后是一个使用它的程序(称为 hello):

use lib "lib";

use ScalarEU;

sub MAIN ($name)
{
  say "Hello, €name!";
}

但它不起作用,或者更确切地说,没有做它应该做的事情:

$ ./hello Tom
Hello, €name!

(我这样写程序是为了让它不会崩溃。)

我还没有添加动作类,但是“令牌印记”的设置方式不应该要求这样做吗?但这个假设是基于 11 年的一篇文章,可能是错误的。

Also, https://github.com/rakudo/rakudo/issues/2404 https://github.com/rakudo/rakudo/issues/2404说 $*LANG 已过时,并使用 $?LANG 代替。 REPL 同意:

> $*LANG
Dynamic variable $*LANG not found

> $?LANG
(low-level object `Perl6::Grammar`)

但程序可以同时使用两者,而不会出现错误。 (我努力了。)


Briefly:你必须改变$!target的字符串ParseSharednqp 对象,这会在解析时更改代码。

Why: The sigil令牌不再是原型,而是已定义的rakudo/src/Perl6/Grammar.nqp https://github.com/rakudo/rakudo/blob/aa5154e02783c7e1a4c5f7a210f622d1908eef31/src/Perl6/Grammar.nqp#L1840作为交替。

所以作为一个最小的解决方案:token sigil { <[$@%&€]> }但新的问题来了:返回值可以是并用于其他语法中。

Where:所以你必须改变$<sigil>.Str定义于nqp/src/QRegex/Cursor.nqp https://github.com/Raku/nqp/blob/57a4d5eacbb7da72e68c08da99d6bfe86cab0506/src/QRegex/Cursor.nqp#L90 as:

method Str()       {
   $!pos >= $!from
        ?? nqp::substr(nqp::getattr_s($!shared, ParseShared, '$!target'),
            $!from, nqp::sub_i(self.to, $!from))
        !! '' }

The string in target between from and to if pos is not so low.

-> 所以我们必须改变$!target之间$!from and $!to in a NQPMatch.

Demo:以下是嵌入俚语语法的代码:

token sigil {
    | <[$@%&]>
    | <nogil> { say "Nogil returned: ", lk($/, 'nogil').Str; }
}

method nogil {
    # The object to return
    my $cursor := self.nogil-proxy;

    # Get from cursor
    my $shared := nqp::getattr($cursor, NQPMatch, '$!shared');
    my $from = nqp::getattr_i($cursor, NQPMatch, '$!from');
    my $target = $cursor.target;

    # Replace in target current character (€) by $
    $target.substr-rw($from, 1) = '$';

    # Set in cursor
    nqp::bindattr_s($shared, $shared.WHAT, '$!target', $target);

    # Return the "created by proxy" and modified NQPMatch
    return $cursor;
}

token nogil-proxy { '€' }

单独说:_它应该适合您的情况。在我的中,(没有印记)我仍然有问题,因为尺寸在$!target修改搞乱了to and from其他光标。在这种情况下:

  1. I must 覆盖NQPMatch.Str函数 https://stackoverflow.com/posts/60982963(希望这是可能的)。
  2. 我必须列出光标(如果可能)并更改它们$!from and $!to明智地归因以恢复银河系的和平或至少在客户端代码中恢复和平。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Perl6:使用俚语添加印记 的相关文章

  • 这个指针操作还有其他语法吗?

    这是一个非常基本的问题 但我不知道如何谷歌它 我有一个指向向量 或指针数组 的指针 比如说 vector
  • 您可以将操作直接应用于map/reduce/filter 中的参数吗?

    map and filter通常可以与列表理解互换 但是reduce并不那么容易被交换map and filter 此外 在某些情况下我仍然更喜欢函数语法 但是 当您需要对参数本身进行操作时 我发现自己正在经历语法体操 最终必须编写整个函数
  • 为什么允许在 for 循环中使用列表订阅? [复制]

    这个问题在这里已经有答案了 Python 如何接受以下构造 l 1 2 3 4 for i l i in enumerate l print l i 似乎没有任何抱怨 愉快地打印出来1 2 3 4 这是如何被允许的以及它到底有什么作用 Th
  • Javascript:使用 IIFE 和块语句之间的区别

    IIFE主要用于封装作用域 function let myVar 10 not global 但为什么不直接使用块语句呢 let myVar 10 also not global 除了范围封装之外 进一步使用 IIFE 是否还有其他好处 块
  • Perl 6 字符将匹配哪些 Unicode 属性?

    The uniprop返回单个属性 put join A uniprop 我取回一项财产 一般类别 Lu 环顾四周 我没有找到一种方法来获取所有其他属性 包括派生属性 例如ID Start等等 我缺少什么 我知道我可以查看数据文件 但我宁愿
  • to_proc 方法在 Ruby 中意味着什么?

    我正在学习 Rails 并关注这个线程 https stackoverflow com questions 1961030 我被困住了to proc方法 我认为符号只是字符串的替代品 它们就像字符串 但在内存方面更便宜 如果我还缺少任何其他
  • jquery 隐藏简单的 javascript 错误

    我在 chrome 和 firefox 中使用 jQuery 和 flot 当我编写代码时 我发现执行在一些愚蠢的事情上会默默失败 例如访问不存在的哈希结构等 感觉 jQuery 中有一些 try catch 逻辑 让我看不到任何错误 有没
  • 用于定义数字的数字常量之前应有非限定 ID

    我是 C 新手 所以我不知道 phidget 代码示例中的此错误意味着什么 Main cpp 8 16 错误 数字常量之前预期有不合格的 id verander de volgende informatie naar de informat
  • 包含重复键的字典文字是否定义良好?

    如果我写d 0 1 0 2 Python 是否保证d 0 或者是 未定义的行为 当然 这不是你想要的ever编程时写的 不过这个问题大多是出于好奇 在本地 它似乎总是保存与该键最后一次出现关联的值 即2这里 不过 对于一些奇怪的代码生成情况
  • Python 3.2 中 **kwargs 和 dict 有什么区别?

    看起来Python的很多方面都只是功能的重复 除了我在 Python 中的 kwargs 和 dict 中看到的冗余之外 还有什么区别吗 参数解包存在差异 许多人使用kwargs 并通过dict作为论据之一 使用参数解包 Prepare f
  • VHDL - ror 和 rol 操作

    我怎么解决这个问题 reg 变量定义为 signal reg STD LOGIC VECTOR 7 downto 0 00000001 下面代码中ror操作有问题 错误信息是 Line 109 Syntax error near ror L
  • 当前上下文中不存在名称“str”

    我在这里声明了一个类变量 void downloader OpenReadCompleted object sender OpenReadCompletedEventArgs e if e Error null Stream respons
  • 类中的易失性变量:“‘易失性’之前预期有非限定 ID”?

    我有两个static volatile我的类中定义的变量ADC 该类写为 裁剪以节省空间 pragma once include PeriodicProcess PeriodicProcess h include
  • 在 C++ 中,为什么我们不能使用 > 和 < 来比较迭代器? [复制]

    这个问题在这里已经有答案了 我被问过这个问题 我真的不知道为什么 如果你有指针int x 您可以将指针与 gt and lt 因为它代表内存位置 例如0x0000 0x0004 0x0008等等 我知道迭代器和指针是不同的 但它们的行为方式
  • 如何让 Raku 中的承诺超时?

    我知道我可以安排Promise在给定的时间内保存 my promise Promise in seconds 但我怎样才能安排它被破坏呢 具体来说 我正在考虑一个将 超时 的承诺 以便它必须保留一定的时间 否则它将失败 我可以和另一个人一起
  • SQL 条件行插入

    如果满足条件是否可以插入新行 例如 我有这个表 没有主键也没有唯一性 image id tag id 39 8 8 39 5 11 如果 image id 和 tag id 的组合不存在 我想插入一行 例如 INSERT WHERE ima
  • 你能在 Python 语法中添加新的语句吗?

    您可以添加新的语句 例如print raise with 到 Python 的语法 说 允许 mystatement Something Or new if True print example 没那么多 如果你should 而是如果可能的
  • 如何禁用 Perl 6 REPL 创建 .precomp

    每次我跑步perl6进入REPL模式 它创建了一个 precomp目录 这也会减慢提示的出现速度 如果 precomp目录已经存在 提示几乎立即出现 否则perl6创建它需要几秒钟 有没有办法禁用此功能 检查您是否有PERL6LIB环境变量
  • 什么是上下文无关语法和巴科斯诺尔范式?

    有人可以用通俗的语言解释一下吗 什么是上下文无关语法 什么是巴科斯诺尔范式 如何使用这个记号 如何进行字符串推导 如何描述语言语法 上下文无关语法 CFG G 是一个四元组 V R S 其中 V 一组非终结符号 一组端子 V R 一组规则
  • 澄清Update() 和FixedUpdate() 的使用? Unity2D [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 所以我知道FixedUpdate应该用于物理操作等 但我很难理解什么算作物理 例如 我通过查看按下的键来移动角色 然后施加力 目前我正

随机推荐

  • 如何仅循环批处理脚本一定的次数?

    如何仅循环批处理脚本一定次数 x10 或其他 如果代码是 echo off loop1 Start taskmgr exe Goto loop loop2
  • HttpRuntime.Cache.Add 中的值为 Null

    我想为其中的一些键存储 nullHttpRuntime Cache因为我不想再次进入数据库发现没有该密钥的条目 所以第一次 它会进入数据库并填充缓存 目的是使用缓存数据来服务以下调用 而不是执行数据库调用 这是我正在使用的代码 Info i
  • 在javascript中访问ruby数组

    我想在 javascript 中访问 Ruby 数组 请告诉我这样做的方法 我的数组保存了 sql 查询的结果 contacts Contact order contacts position ASC 我正在尝试这样做 for var i
  • 导入 F2Py 模块时如何“捕获”段错误?

    一些背景 其相关性可能会波动 我目前拥有一些 F2Py 库 F2Py 从一些 Fortran 代码编译的 Python 模块 出于所有意图和目的 您可以将这些模块视为 第三方 我目前无法访问 Fortran 源代码 并且我不负责编译过程 这
  • 如何将 shell 变量导出到所有会话?

    我想知道有没有办法将我的 shell 变量导出到系统中的所有会话 不仅仅是当前会话 我不想在 bashrc 文件中设置它 因为 shell 变量是动态变量 它会不时更改 您可以通过在调试中设置陷阱来设置会话以继续重新读取磁盘上的文件 bas
  • 如何在 ASP.NET 项目中设置无限会话超时?

    我正在开发一个 ASP NET 项目 如何增加会话超时 无限超时 或者我应该在 IIS 上执行此操作 如果可以的话请解释一下 您可以设置session timeout in web config如下所示 该值显示分钟 因此您可以根据需要设置
  • CSS 中报告部分样式列表编号?

    现在我了解了 正常 CSS 列表样式 罗马 拉丁等 当然在过去的几年里 它们在不允许诸如以下内容方面有些不灵活 a or a only a 现在我相信你可以通过 before 和 after 伪元素得到像上面这样的效果 那是对的吗 如果可以
  • 如何填充seaborn分布图中曲线下的面积

    我有两个变量 x 1 883830 7 692308 8 791209 9 262166 y 5 337520 4 866562 2 825746 6 122449 我想使用 matplotlib 包装的 seaborn 来拟合高斯分布 似
  • 如何打破多个 foreach 循环? [复制]

    这个问题在这里已经有答案了 我有四个 foreach 循环 它们遍历集合并根据条件执行某些操作 这是我现在正在编写的代码 boolean breakFlag false String valueFromObj2 null String va
  • iOS 自动布局:两个并排的宽度相等的按钮

    我目前在自动布局方面遇到困难 我正在使用界面生成器 并尝试并排放置两个宽度相等的按钮 如下图所示 从下面的预览图像中 我的 titleImage 已被正确约束并正确显示 但按钮却不然 我尝试将按钮 1 与 titleImage 的前缘对齐
  • 在控制台应用程序中使用 Razor 的最佳方式是什么

    我知道以前也有人问过类似的问题 但唯一的答案是六年前的 而且人们提到的项目似乎没有得到维护 我想在控制台应用程序或类库中使用 Razor 来渲染 HTML 我还想在 cshtml 文件中使用智能感知 目前 我可以通过执行以下操作来临时操纵此
  • 如何将python/cython unicode字符串转换为长整数数组,以进行levenshtein编辑距离[重复]

    这个问题在这里已经有答案了 可能的重复 如何纠正 Damerau Levenshtein 实施中的错误 https stackoverflow com questions 3431933 how to correct bugs in thi
  • Eclipse 上的 Android Launcher 应用程序编译

    我正在修改 Android Home 启动器 应用程序 并从 Android 源签出配置了一个 Eclipse 项目 Eclipse 项目显示了许多与未解决的导入和不可用标志有关的错误 在互联网上查看后http forum xda deve
  • Laravel 4.2:如何在 Laravel 中使用 SUM 排序

    我有3张桌子 Posts id post Points id user id post id points User disregard id username 我的模型是这样的 Class Posts extends Eloquent f
  • 当我有两个版本的 python 时,如何在 PyCharm 中更新 pip?

    我已在 Windows 10 上安装了 Python 2 7 和 Python 3 5 我在当前的 PyCharm 项目中使用 python 2 7 并且该项目的 python 解释器设置为 python 2 7 现在我打开 PyCharm
  • 如何开发 ASP.NET Web API 来接受复杂对象作为参数?

    我有以下 Web API GET public class UsersController ApiController public IEnumerable
  • 最大总和查询

    我正在尝试编写一个查询 该查询将列出以最大总学分注册的学生 这是我的查询 SELECT s S ID s S LAST s S FIRST s Total Credits FROM SELECT q2 S ID q2 S LAST q2 S
  • 当列表视图滚动时复选框自动调用onCheckedChange?

    我的列表视图有问题 其中列表项包含复选框 当我选中一个复选框并滚动列表时 复选框有时会自动调用 oncheckedchange 并且复选框的值会更改 或者 当我的列表有超过 9 或 10 项时 那么当我检查第 1 项时 会检查第 8 项或第
  • 从 javascript 中的嵌套函数返回

    我正在尝试创建一个使用 jquery 的 ajaxfunction 从我的 ajax php 文件中获取一些信息的函数 code function ajaxIt dataLine ajax type POST url ajax php da
  • Perl6:使用俚语添加印记

    我正在尝试添加 作为 标量的别名 我认为使用俚语来实现这一点是可行的 但 perl6 doc 根本没有提到俚语 我已阅读以下内容 https perlgeek de en article mutable grammar for perl 6