一个拼接语法类,匹配可选模式并绑定属性

2024-03-08

我的拼接语法类定义如下。语法类匹配两个语句(第一个模式)、其中一个语句(第三个和第二个模式)的序列,甚至可能根本不匹配这些语句(最后一个模式)。

正如您所看到的,有相当多的“重复”代码,因为每个模式要么返回模式中捕获的某些内容的属性,要么返回空的内容。我遇到的问题是,目前该语句从来都不是真正可选的,因为最后一个模式must匹配某事。在这种情况下,一组空括号().

问题是:如何使该声明真正成为可选的?作为一个附带问题 - 可以通过更好地利用头部模式来压缩代码吗?

(define-splicing-syntax-class signal-subscriptions-and-declarations
  #:description "subscriptions to signals and signal declarations"

  ; Match the case where both a subscription and declaration statement is present
  (pattern (~seq subscribed:signal-subscriptions  declared:signal-declarations)
           #:with (subscription-collection  ...) #'(subscribed.signal-collection ...)
           #:with (subscription-signal-id   ...) #'(subscribed.signal-identifier ...)
           #:with (declaration-signal-id    ...) #'(declared.signal-identifier ...))

  ; Match the case where no declaration statement is present
  (pattern subscribed:signal-subscriptions
           #:with (subscription-collection ...) #'(subscribed.signal-collection ...)
           #:with (subscription-signal-id  ...) #'(subscribed.signal-identifier ...)
           #:with (declaration-signal-id   ...) #'())

  ; Match the case where no subscription statement is present
  (pattern declared:signal-declarations
           #:with (subscription-collection ...) #'()
           #:with (subscription-signal-id  ...) #'()
           #:with (declaration-signal-id   ...) #'(declared.signal-identifier ...))

  (pattern ()
           #:with (subscription-collection ...) #'()
           #:with (subscription-signal-id  ...) #'()
           #:with (declaration-signal-id   ...) #'()))

听起来你有两个独立的东西,两者都是可选的。因此,有两个单独的语法类是有意义的,如下所示:

(define-splicing-syntax-class opt-signal-subscriptions
  ;; Match the case where a subscription is present
  [pattern (~seq subscribed:signal-subscriptions)
           #:with (subscription-collection  ...) #'(subscribed.signal-collection ...)
           #:with (subscription-signal-id   ...) #'(subscribed.signal-identifier ...)]
  ;; Match the case where no subscription is present
  [pattern (~seq)
           #:with (subscription-collection  ...) #'()
           #:with (subscription-signal-id   ...) #'()])

(define-splicing-syntax-class opt-signal-declarations
  ;; Match the case where a declaration statement is present
  [pattern (~seq declared:signal-declarations)
           #:with (declaration-signal-id    ...) #'(declared.signal-identifier ...)]
  ;; Match the case where no declaration statement is present
  [pattern (~seq)
           #:with (declaration-signal-id    ...) #'()])

这两个都使用一个空的(~seq)case(匹配 0 个术语)以使其可选,而不是(),匹配 1 个术语。然后可以像这样定义与原始语法类类似的语法类:

(define-splicing-syntax-class signal-subscriptions-and-declarations
  #:description "subscriptions to signals and signal declarations"
  #:auto-nested-attributes
  [pattern (~seq :opt-signal-subscriptions :opt-signal-declarations)])

这与您原来的不同,因为这可以匹配 0、1 或 2 个术语,而您的则需要至少 1 个术语,这必须是()当两个选项都不存在时。

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

一个拼接语法类,匹配可选模式并绑定属性 的相关文章

  • 用于定义给定重复模式的函数的球拍宏

    这个问题很难解释 因为我需要整理思绪 所以请耐心等待 为了说明目的 我已经能够将问题简化为最小的示例 这个例子对于它的用途没有任何意义 但我离题了 假设我想扩展球拍语言来编写如下所示的内容 define something a whatev
  • 函数式编程语言的静态分析器,例如Scheme

    我很少看到像Racket Scheme这样的函数式编程语言的静态分析器 我什至怀疑是否有 我想为函数式语言编写一个静态分析器 比如Scheme Racket 我该怎么办 是的 有一些关于像Scheme这样的动态语言的静态分析的工作 例如 请
  • DrRacket 中的宏步进器

    在链接上http www ccs neu edu home ryanc macro stepper tutorial html http www ccs neu edu home ryanc macro stepper tutorial h
  • 从 DrRacket 读取命令行参数

    当使用球拍运行脚本时 如何检测给出的命令行参数 也就是说 相当于 Python 中的 sys argv Java 中的 args 等 您有以下选择 您可以在文档中查找所有选项以获取更多信息 current command line argu
  • 如何检测 Racket Web 应用程序上的按键?

    我已经浏览了网络服务器的文档 但找不到任何内容 这是我的基本 Web 应用程序的代码 lang racket require web server servlet web server servlet env define test def
  • 球拍/计划过滤

    我如何过滤它以显示所有蔬菜 先感谢您 Pecan 1982 nut AL Blackberry 2004 fruit AL Peach 2006 fruit AL Rice 2007 grain AR Orange 2005 fruit F
  • 在球拍中使用 stop-when

    我一直在搞这个程序 它需要一个数字并加 1 我想知道你到底如何使用stop when这里 例如 让它停在 5 点 我想这里需要一个 cond 声明 谢谢 require 2htdp image require 2htdp universe
  • 编码霍夫曼树方案[关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我正在尝试编写一个函数 codeWords t 它遍历霍夫曼树 添加 0当它向左移动时 添加 1当它向右时 并以叶子上的
  • 尾递归Map函数RACKET

    Racket 中的映射函数采用一个函数和一个列表 并将该函数递归地应用于列表中的每个项目 我正在尝试将映射转换为尾递归函数 这该如何完成 你被困在哪里了 您可以定义自己的map程序与内部loop程序 define map f in defi
  • 一个拼接语法类,匹配可选模式并绑定属性

    我的拼接语法类定义如下 语法类匹配两个语句 第一个模式 其中一个语句 第三个和第二个模式 的序列 甚至可能根本不匹配这些语句 最后一个模式 正如您所看到的 有相当多的 重复 代码 因为每个模式要么返回模式中捕获的某些内容的属性 要么返回空的
  • 本地球拍

    我正在书中阅读有关本地定义的内容 并且遇到了这个例子 local define f x x 5 define g alon cond empty alon empty else cons f first alon g rest alon g
  • 如何创建一个包含 n 个过程应用程序的列表

    我的问题与this one https stackoverflow com questions 249374 scheme procedure to compute the nth repeated application of a fun
  • 有人能用简单的话解释一下 call/cc 吗?

    我正在研究语言球拍并试图掌握 call cc 的实际用途 有人可以用简单的语言解释一下并举一两个例子吗 谢谢 并非所有实现call cc完全相同 但希望这个答案可以适用于所有常见的变体 包括球拍 没有什么麻烦 这个故事其实是根据c内置于Un
  • 方案:为什么内部定义比外部定义快?

    我尝试运行下面的程序 define odd internal x define even x if zero x t odd internal sub1 x if zero x f even sub1 x define odd extern
  • Racket 中的“match”可以具有带有来自外部作用域的变量的模式吗?

    考虑以下示例 lang racket match cat doge a b match b a t f Not a pair 如果我想匹配头部和尾部相同的对 我可能会这样写 但这不起作用 因为第二个a被绑定为一个新变量 并且匹配任何内容 是
  • 方案中的多维向量?

    我之前问过一个关于方案中数组的问题 结果它们被称为向量 但在其他方面基本上与您期望的相同 有没有一种简单的方法可以在 PLT 方案中处理多维 arrays 向量 出于我的目的 我想要一个名为make multid vector或者其他的东西
  • 为什么Racket中foldl的定义方式很奇怪?

    在 Haskell 中 与许多其他函数式语言一样 函数foldl被定义为 例如 foldl 0 1 2 3 4 10 这没关系 因为foldl 0 1 2 3 4 根据定义 0 1 2 3 4 但是 在 球拍 中 foldl 0 1 2 3
  • 我在函数的最后一次递归调用中得到“方案应用程序而不是过程”

    所以这是代码 define time prime test n newline display n start prime test n runtime define start prime test n start time if pri
  • 如何在 DrScheme 中包含文件?

    我正在使用 DrScheme 来完成 SICP 并且我注意到某些程序 例如 square 一遍又一遍地使用 我想将它们放在一个单独的文件中 以便我可以将它们包含在其他程序中 而不必每次都重写它们 但我似乎不知道如何做到这一点 我试过了 lo
  • 将数字转换为英文字母列表

    我有下面的函数 它将数字输入转换为这些数字的部分翻译的单词输出 使用乘积和商 它将数字的单词表示相加 同时将数字分组 例如 number name 87969087 gt 87 million 969 thousand 87 number

随机推荐

  • 二叉搜索树的广度优先遍历 C++

    也许是快速 简单的问题 我已经实现了一个二叉树 然后我希望将二叉搜索树转换为数组 或者至少像在数组中一样打印出来 我遇到的问题是如何获取 0 中的 NULL 标志 例如 假设我有一棵树 如下所示 10 6 12 1 8 15 4 我希望它按
  • 如何在 Cakephp 中发出 https post 请求

    我有一个要求 应用程序必须通过 HTTPS POST 进行 REST API 调用 我是 cakephp 的新手 我在想是否可以使用 httpsocket 进行 https 调用 我很感激任何帮助 Thanks 您可以使用其中任何一个 CA
  • MacPorts gcc48 无法识别命令行选项“-stdlib=libc++”

    Context 我正在尝试编译包 root numpy 它是科学分析软件 root 和python包 numpy 之间的链接 它用作根包装器 rootpy 的一部分 执行以下行时出现 g 错误 g bundle undefined dyna
  • EF AddOrUpdate 种子不更新子实体

    我在播种数据时遇到一些问题 我能够使用一个非常小的应用程序重现该问题 鉴于您有这种种子方法 protected override void Seed JunkContext context context Junks AddOrUpdate
  • GCM 响应中的multicast_id 是什么?

    示例场景 我正在使用 GCM 向多个设备发送消息 响应包含 multicast id 我该如何使用这个值 Thanks 它只是一个标识符 多播ID标识多播消息的唯一 ID 编号 该 ID 没有用处 除非您希望将其作为 Google 的 收据
  • npm运行服务报错

    我在运行命令时遇到问题 npm 运行服务 要修复它 我需要注销或重新启动我的 Ubuntu 16 04 我检查了正在运行的任务 节点没有运行 我还卸载了node和npm并再次使用NVM安装 但我仍然有问题 NPM错误日志 gt email
  • SSIS 包中的步骤如何检查时间?

    我的控制流中的起始项目需要是检查时间并设置变量的项目 控制流项中是否有一个项可以做到这一点 访问您的系统变量 System StartTime 将是包开始执行的时间 如果开始执行和需要评估当前时间的元素之间有很长的时间 您可以查看 Cont
  • SQL Server - 向所有表添加默认约束

    有没有办法编写一个脚本来检查数据库中的每个表 寻找uniqueidentifier列名为ID 然后添加一个DEFAULT的约束NEWID 到列 如果DEFAULT约束不存在 根据OP的评论澄清进行编辑 该脚本创建一个DEFAULT的约束NE
  • 解决方案范围内的预构建活动?

    我在 Visual Studio 中有一个解决方案 其中包含多个项目 我想在每次构建的一开始就运行一个命令 无论涉及哪些项目以及它们是否是最新的 本质上 我需要类似于解决方案范围内的预构建事件的东西 但不幸的是 VS 似乎不支持这些 有谁知
  • Haskell:解析命令行参数

    这更多的是一个风格问题 而不是一个如何做的问题 所以我有一个需要两个命令行参数的程序 一个字符串和一个整数 我是这样实现的 main do args aString aInteger lt getArgs let parsed n read
  • 多列代表一个值时的频率表 (R)

    我有一个这样的数据集 ID color1 color2 color3 shape1 shape2 size 55 red blue NA circle triangle small 67 yellow NA NA triangle NA m
  • 数据库连接何时以及为何昂贵?

    我正在对数据库进行一些研究 并且正在研究关系数据库的一些局限性 我发现大表的连接非常昂贵 但我不完全确定为什么 DBMS需要做什么来执行连接操作 瓶颈在哪里 非规范化如何帮助克服这种费用 其他优化技术 例如索引 有何帮助 欢迎个人经历 如果
  • Eclipse 配置错误:无效的 Google App Engine 目录

    我在创建 Pydev Google App Engine 项目时遇到问题 配置在选择 Google App Engine 目录时停止 以下是我将目录指向 C Program Files Google google appengine 后遇到
  • Android Studio 2.2 不支持的方法异常

    我将我的 android studio 更新到了 2 2 现在 当我打开并运行以前的项目时 我收到错误 UnsupportedMethodException Unsupported method AndroidProject getPlug
  • Sntp.sync() 忽略服务器

    我一直在尝试与 ntp 服务器同步时间 但是 nodemcu 似乎忽略了服务器参数 sync lua sntp sync fr pool ntp org function tm rtctime epoch2cal rtctime get p
  • SCRIPT5009:“$”在 IE9 中未定义

    我有一个书签 它将 div 加载到当前页面并在其中放置一个 iframe 除了 IE9 之外 小书签在所有浏览器中都可以正常工作 甚至可以在早期版本的 IE 中使用 我正在使用以下书签框架 http idc anavallasuiza co
  • 如何隐藏 mkmapview monotouch iPhone 的合法链接

    MKMapview 在其右下角有合法链接 我想在这个地方添加一个按钮 该按钮具有某种透明度 我可以隐藏法律链接吗 或者 如果我以隐藏此链接的方式设置按钮 苹果可能会拒绝我的应用程序 我的地图视图中也有一些类型的子视图 尝试使用这个 但我不知
  • 使用 dbcontext 的正确方法(全局还是作为参数传递?)

    当我调用需要的方法时dbcontext for update or insert但只想要一个saveChange 喜欢关注 操作 登录 TempDBEntity context new TempDBEntity var temp conte
  • 如何从 PHP 中的 Base 64 字符串获取图像大小

    我正在获取图像字符串的基数 64 我必须移动文件夹并将图像路径存储在数据库中 但我必须限制文件大小 我该如何执行此操作 我从 Base 64 字符串生成图像的代码如下 if image is attached with request Im
  • 一个拼接语法类,匹配可选模式并绑定属性

    我的拼接语法类定义如下 语法类匹配两个语句 第一个模式 其中一个语句 第三个和第二个模式 的序列 甚至可能根本不匹配这些语句 最后一个模式 正如您所看到的 有相当多的 重复 代码 因为每个模式要么返回模式中捕获的某些内容的属性 要么返回空的