问题标签 [syntax-rules]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
162 浏览

racket - 提供语法规则球拍

如何在球拍中提供语法规则?

我有与此类似的代码:

如何使用提供语句来提供 FROM WHERE 和星号?

这就是我提供 SELECT 的方式:

0 投票
1 回答
74 浏览

macros - 使用语法规则引入命名变量

我正在尝试使用语法规则编写一个超小型的面向对象系统,主要是为了学习它。无论如何,我正在尝试引入一个“this”变量。这是我希望能够做到的:

除了“这个”之外,我可以让一切正常工作。似乎语法规则不允许变量引入。我以为我可以通过将其定义为语法规则中的文字之一来获得它,但这似乎不起作用。

下面是我的面向对象系统:

这适用于除 'nextnext 之外的所有内容,当它尝试引用“this”时会出错。

这是正确的方法吗?还有其他方法可以做到这一点吗?我承认这有点不卫生,但这至少不是指定文字的一部分吗?

我已经在 Chicken Scheme 和 DrRacket 中尝试过 R5RS 模式(其他模式抱怨“这个”)。

下面是整个文件。您可以使用“csi object.scm”在 Chicken 上运行它

https://gist.github.com/johnnyb/211e105882248e892fa485327039cc90

我还尝试使用 let-syntax 并使用 (this) 作为语法说明符来引用 (this) 变量。但是,据我所知,它并没有让我在语法重写中直接访问我自己制作的变量。

奖励问题:查看语法规则转换结果以进行调试的简单方法是什么?有没有办法让鸡肉(或其他东西)进行转换并吐出结果?我在 DrRacket 上尝试了一些东西,但它在 R5RS 模式下不起作用。

0 投票
1 回答
103 浏览

macros - 方案宏成对处理题

(现在请忽略我所追求的是非方案,因为这是针对非程序员的 DSL)

我想做一些与此等效的事情:

这将扩展为m我定义的另一个宏(因此我不能简单地使用可变参数样式函数):

我试过这个:

但正如我猜测的那样,它扩展到:

我有点坚持如何以我想要的方式成对处理这些元素,而不需要用户添加内括号。

0 投票
1 回答
191 浏览

macros - Guile `syntax-rules`:表格中的省略号;如何用两个椭圆编写这个宏?

我试图或多或少地let通过重新创建一个构造,syntax-rules但它似乎在使用两个椭圆时绊倒了。

我试着这样写出来:

我认为中间的不同模式[binding2 funct value2]将能够提供一个清晰的划分,就模式而言,第一个模式何时结束以及第二个模式何时开始,但我不断收到标题中的错误。

预期的结果是能够做类似的事情

并返回2,但能够在远程需要var之前和之后拥有尽可能多的 s,diff因此最终使用的变量的顺序无关紧要。

我错过了一些明显的东西吗?这种模式是否可以用卫生宏来完成?谢谢你的帮助!

0 投票
2 回答
286 浏览

macros - 方案:如何在没有括号的语法规则中扩展具有多个变量的模式

我正在尝试在 Scheme for Picolisp 样式let表达式中编写一个宏,我们称之为宏let-slim。为了更简洁(如 Picolisp),我希望它们的用法在仅声明一个变量时看起来像这样

或者像这样声明任意数量的变量(注意这是伪代码,我实际上不会包含省略号)

第一个用例编写匹配模式相当简单syntax-rules,但我正在努力解决后者。

这不起作用,因为只会init重复

这不起作用,因为它被认为是错误的省略号

这不起作用,因为我需要在参考点使用括号(这意味着与内置的相比,它完全没有改变let

那么,有没有一种方法可以重复 2 个变量syntax-rules而无需将它们包装在括号中,还是我需要使用不同的宏系统(即syntax-casedefmacro)?

0 投票
1 回答
80 浏览

scheme - 在文字之前匹配任意数量的模式变量的方案语法规则?

我正在尝试编写一个宏,将表达式中的一些文字替换为一个值,例如(substitute 3 (+ 4 1 _ 1 5))

这是我目前所拥有的

我如何概括这一点?或者真的,我应该如何解决这个问题?

0 投票
1 回答
34 浏览

macros - Scheme 的语法规则——在 `...` 中混合不同的语法选择

假设我有一个宏(define/custom (name (arg type) ...) body ...)扩展为(define (name arg ...) body ...). 这很容易。

现在,我不仅要允许(arg type)作为参数传递,而且要简单地传递arg. 好的,所以我写了第二个子句,将 where(define/custom (name arg ...) body ...)扩展为(define (name arg ...) body ...). 也很容易。

但是有了这样的解决方案,要么所有参数都带有类型,要么都没有。我怎样才能允许在同一个语法列表(或任何...所谓的)中混合这两个选项?我该怎么做,例如。(define/custom (name arg1 (arg2 type2)) #f)适当扩展为(define (name arg1 arg2) #f)? 直觉是使用辅助宏,它会扩展(helper a)a、 和(helper (a b))a并使(define/custom (name arg_or_arg+type ...) body ...)扩展为(define (name (helper arg_or_arg+type) ...) body ...),但正如您可能知道并猜测到的那样,这是行不通的,因为define扩展发生在helper扩展之前。

0 投票
0 回答
31 浏览

macros - 是否可以仅使用语法规则来定义照应宏?

是否可以仅使用来编写照应宏(例如aifsyntax-rules?这样的宏需要打破宏观系统的卫生。我知道这是可能的syntax-case,但syntax-rules在 R5RS 和 R7RS-small 中是否有可能?如果是这样,您能否提供一个仅aif使用实现“照应 if”()的最小示例syntax-rules

0 投票
1 回答
62 浏览

scheme - 为什么我的(诡计)方案宏要评估它的论点?

在 Guile 中,我正在努力学习define-syntaxsyntax-rules. 我的印象是方案宏不评估他们的论点,但我的似乎正在这样做:

如果我用 调用它(foo bar),我会收到错误消息

未绑定变量:bar

而如果我用 调用它(foo 'bar),我会得到预期的

“来电者说BAR!”

这看起来好像在应用宏之前对参数进行了评估。

0 投票
1 回答
34 浏览

scheme - 卫生宏扩展器必须了解哪些Scheme特殊形式?

syntax-rules在 Scheme 中是“卫生的”和“引用透明的”,并且必须保留 Scheme 的词法范围。据我了解,这意味着在宏扩展阶段,扩展器需要了解lambdadefine

  • 扩展器需要了解lambda. 假设我们有这样的代码: 如果扩展器不知道lambda特殊形式,它会认为两个xs in(lambda (x) x)绑定到xin (define x 1),这是不正确的。
  • 扩展器需要知道关于define,以便它知道在哪里(即在哪个范围内)定义了特定标识符。另外,假设我们有这样的代码: 为了正确确定两者都n(lambda n n)reference 中(define n 1),扩展器必须理解(define lambda f)已经改变了的含义lambda(因此扩展器必须停止使用特殊规则来处理lmabda此范围)。

宏扩展器还需要了解哪些其他特殊形式?它需要知道set!吗?