【问题标题】:What are some macro systems in Non-Lisp languages? [closed]Non-Lisp 语言中有哪些宏系统? [关闭]
【发布时间】:2013-10-18 15:06:33
【问题描述】:

我使用过 Scheme 和 Clojure,我在他们的宏系统和 lisp 语法(缺少语法)可能性方面玩了很多。

但是,我还没有发现许多其他的宏系统语言像使用 Lisp 语法的语言那样复杂和有用。(我不算 C/C++)

有一些值得注意的例子吗?

【问题讨论】:

  • 我对这个问题的答案很感兴趣,但我确实认为这与 Stack Overflow 无关:这里没有一个正确的答案(尽管有些答案实际上可能是错误的):“那里可能的答案太多,或者好的答案对于这种格式来说太长了。请添加详细信息以缩小答案集或隔离可以在几段中回答的问题。"
  • 看看 Katahdin (bit.ly/c5MEl)、Template Haskell、Nemerle、Converge、MetaOCaml、JetBrains MPS。
  • 我要求一份具有复杂宏系统的非 lisp 语言的良好列表,这对我来说似乎可以用几段来回答

标签: syntax macros programming-languages lisp syntactic-sugar


【解决方案1】:

Dylan 也有 a macro system,但没有经典的类似 Lisp 的全括号语法。

据称是数学。我自己没有使用过它,不过根据this answer,它比 Lisp/Scheme 宏更令人困惑。

根据您如何定义“宏系统”,Template Haskell 也可能算在内。

【讨论】:

    【解决方案2】:

    Algol dialects 带有宏(元编程功能)我可以想到 NemerlePerl6。这意味着在 Algol 方言中拥有强大的宏并非不可能,但与任何 LISP 方言相比,它总是非常困难,因为 Algol 语法很少像 LISP 方言那样类似于它自己的 AST 树。

    【讨论】:

    • 您不需要带有准引用的原始 AST。
    • @SK-logic 这只是挑战的一半。想象一下,我希望 3 * 5 ¤ 2 + 2 变成 3 * something(5 2) + 2loopdown x y { ... } 变成 while ( x != 0 && y != 0 ) { ... x--; y--}。制作这样的宏需要修改解析器和优先规则。这是 AST 与代码不同的部分。
    • 优先规则的改变并不一定意味着解析器的改变。我的一种玩具语言使用普通的数学符号进行算术运算,+-*/ 优先级是在其标准库中使用方法定义的
    • @Sylwester,解析器现在非常灵活(想想 PEG、GLR 等),所以我认为这里没有问题。看看 Katahdin、Fortress 和 PFront 等语言。
    【解决方案3】:

    我的语言Slate 有一个Lisp 级别的宏系统,但使用Smalltalk 风格的语法管理它。特别是,我们在默认情况下设法保持卫生(但可以捕获)并且避免 CONS 单元意味着我们的 AST 节点是可以定义代码遍历递归方法的数据类型,这意味着代码遍历和转换比在 Lisp 中容易得多.

    但是,许多较新的语言(我打算评估 Rust 和 Julia)都有某种形式的句法宏,因此会有更多示例可供选择。

    【讨论】:

      猜你喜欢
      • 2010-10-16
      • 2011-01-13
      • 2020-07-25
      • 1970-01-01
      • 2016-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-09
      相关资源
      最近更新 更多