Macros 如何在Lisp中定义中缀符号宏,而不使用类似Lisp的语法

Macros 如何在Lisp中定义中缀符号宏,而不使用类似Lisp的语法,macros,lisp,common-lisp,Macros,Lisp,Common Lisp,因此,在观看了3个小时的youtube视频,并花了同样长的时间阅读了Lisp之后,我还没有看到这些神奇的宏,它们允许人们编写DSL,甚至可以做一些简单的事情,比如4+5,而不必将其嵌套在一些括号中 这里有一些讨论:但是语法看起来并不好,仍然需要一些封闭的绒毛来定义宏的开始和结束位置 所以这里是一个挑战,定义一个中缀宏,然后使用它,而不必使用其他语法。即 Some macro definition here 1 + 2 不是 不是 如果这在Lisp中是不可能的,那么所有的大惊小怪是什么呢?这有

因此,在观看了3个小时的youtube视频,并花了同样长的时间阅读了Lisp之后,我还没有看到这些神奇的宏,它们允许人们编写DSL,甚至可以做一些简单的事情,比如4+5,而不必将其嵌套在一些括号中

这里有一些讨论:但是语法看起来并不好,仍然需要一些封闭的绒毛来定义宏的开始和结束位置

所以这里是一个挑战,定义一个中缀宏,然后使用它,而不必使用其他语法。即

Some macro definition here

1 + 2
不是

不是


如果这在Lisp中是不可能的,那么所有的大惊小怪是什么呢?这有点像是说你有非常强大的宏,允许很酷的DSL,只要这些DSL是用类似Lisp的语法包装的。

当然你可以用Lisp实现你所说的

Lisp和其他语言的一大区别是,没有固定的东西,您可以控制读取器对输入源代码的每个字符所做的操作。真的

以项目为例

基本上,在这种模式下,如果键入的内容以一个开括号开始,那么它被认为是Lisp,否则它被认为是包含多行结构的Python

然而 这种宏/读取器宏库很少实现,因为s-expression方法的主要优点之一是它具有良好的可组合性,您可以在现有宏的基础上构建其他宏,从而提高语言的级别

一旦放弃了S表达式方法的正则性,编写宏就变得烦人,因为编写代码的代码需要考虑语言的几种不同结构、优先级规则、特殊规则、特殊语法形式。 不基于s-expression的语言有时提供真正的宏处理能力,但在AST级别工作,即在以固定方式完成某些解析处理之后。此外,这些语言中的宏代码看起来非常奇怪,因为宏正在操作、检查或构建的代码看起来不像真正的代码

有时在其他语言中,您只能找到基本上是搜索替换的基于文本的宏。要看到一个丑陋的事物的例子可以考虑Python绕线284和它的一组荒谬的限制仅仅是因为这个实现引起的。

另一个例子,当你强迫自己去用一个模板的方法来避免处理一个不规则的特殊的用例语言的复杂性时,事情会变得非常复杂,这就是C++模板元编程。 一个简单的基于s表达式的语言和准引号反而使宏代码更容易编写、阅读和理解,这就是为什么Lisp代码没有离开它。不是因为它不能,而是因为毫无理由地使用更糟糕的语法是没有意义的

在Lisp中,您可以通过添加真正需要的抽象来稍微弯曲语言,而不会破坏其他一切,最重要的是,如果需要的话,也不会降低将来进行更多弯曲的能力。编写宏/阅读器宏,使表达式解析C++的噩梦,同时消除进一步宏的写入能力和增加更多结构的能力,或者使其难以实现的可能是一种无意义的自杀。 即使是中缀x+y*z这样的宏也只是一个练习。。。我怀疑任何lisper都不会用它来编写真正的代码。。。究竟为什么会有人重新引入荒谬的函数/运算符二元性和优先级/结合性规则的噩梦?如果你不喜欢Lisp,那就不要使用Lisp

对于口吃者来说,丑陋的不是中缀和部分。。。中间是什么。


为什么你认为2+3*6自然就是20?因为当你还是个孩子的时候,老师用棍子打你的手掌,直到你做对为止?

我认为这是不可能的。代码的基本语法不是真正可自定义的。您需要某种方法来告诉它使用备用语法开始处理表达式,以及何时停止,这需要某种包装器。Stackoverflow不适用于发布编程挑战。它适用于实际的编程问题,最好使用一些代码、示例使用和错误描述。Stackoverflow说:“关注你所面临的实际问题。包括您尝试过的内容以及您正在尝试做的事情的详细信息。@PauloMadeira No.如果它对于堆栈溢出来说太宽,那么对于程序员来说可能太宽了。我们不进行讨论。@PauloMadeira我没有说这是离题的。我说它太宽了。对我来说,它读起来像是一个讨论的开始,而不是一个关于理解一个概念或解决一个问题的问题。由于我是一名程序员版主,我想我对如果发布到
另一方面,塞姆特贝斯特的帖子语气可以也应该更加礼貌。例如,请注意所有大写的NOT,当您可以只提到宏时引用了神奇的宏,如fluff和fuss…//为什么您认为2+3*6自然是20?//数学有大量不同类型的符号。。。它不只是停留在中缀和后缀,考虑求和或限制,或设置Builder符号,或MatRICE,类别理论图。数学家甚至把函数和变量放在彼此的上面——用不同的字体。这不是什么是自然的问题,而是如何有效沟通的问题。当有人把操作员放在中间时,他们正在通信,这是一个代数运算,……很可能代数性质是可以假设的。当函数放在它的参数之上时,它意味着参数代表一个序列。一种语言的能力越强,它的交流效率就越高——如果一种语言不能很容易地支持几种符号,那么它就不能有效地交流,也永远不会被主流采用。无论如何,这篇文章不应该引起争论,我真的很想知道如何做到这一点,因为有人告诉我我应该Lisp,因为我正在为LaTeX编写自己的宏编译器。@samthebest:在数学中,当你看到a×b时,你可以猜得很少,因为这取决于上下文。它可能是内部操作,也可能不是,例如ℝ²,它可以是交换的,也可以不是向量积、矩阵乘法。通常情况下,这个操作是关联的,但总的来说还是不正确的。事实上,你所知道的不多,除了在某个空间中,给定a和b会返回其他东西。这只是一个双变量函数,这不是我读纯数学本科或研究生学位时所学的。符号在数学中有着巨大的意义,我不知道你们怎么能否认这一点,但在你们自己的评论中你们使用了R^2,很清楚这意味着与R_2完全不同的东西。是的,群论从结合性开始…中缀确实意味着代数结构,后缀意味着任意函数。非对称中缀关系符号意味着及物性,等等。是的,在真正确定这些属性之前,需要数学证明,但这不是表示法,表示法和语言通常是用于交流,而不是证明语句。教科书中的大多数数学证明甚至都不是正式的,它们传递证明,读者必须在头脑中执行大量步骤。
Some macro definition here

(my-macro 1 + 2)
Some macro definition here

ugly-syntax 1 + 2 end-ugly-syntax