【问题标题】:What does it mean if macros in a Lisp are monadic?如果 Lisp 中的宏是一元的,这意味着什么?
【发布时间】:2016-05-03 08:45:35
【问题描述】:

Lux Language introduction我们读到:

与大多数其他 lisps 不同,Lux 宏是一元的。 (Lux a) 类型是负责通过宏线程化Compiler 实例来实现魔法的类型。宏必须具有Macro 类型,然后声明为宏。

现在我假设这意味着在编译时可以获得额外的类型检查信息,从而为您提供有关代码正确性的一些反馈。

但是你可以在编译时发现的宏有什么不正确之处呢?

我的问题是:如果 Lisp 中的宏是一元的,这意味着什么?

【问题讨论】:

  • 开发日志在Macros in Lux 上有一篇博文。这谈到了使用 monad 来简化宏解析。

标签: macros lisp monads static-typing


【解决方案1】:

粗略一看,似乎“普通”宏和阅读器宏在 Lux 中都是一元的。

对于普通宏,它们通过线程处理Compiler 类型的状态。各种宏操作(我想gensyming 将是一个明显的例子)需要改变这个内部状态,因为它们依赖于有状态的效果,比如维护下一个可用的新原子。线程状态(即看起来像 s -> (a, s) 的函数,获取初始状态作为参数并返回更新的状态和结果)表现出明显的一元结构,即给定一些第一步 s -> (a, s),选择下一步 s -> (b, s)可以依靠查看中间结果a

对于阅读器宏,这是一个类似的故事,除了所讨论的效果是输入的消耗。一元解析器允许先前使用的输入影响后续输入的解析方式。

【讨论】:

  • 太棒了 - 与 Common Lisp 中的宏相比,我有什么好处?
  • 我对 Common Lisp 阅读器宏了解不多,但是常规的 Common Lisp 宏已经是一元的了。只是在没有像gensym这样的静态类型效果的情况下,每个效果都更像是一种副作用,所以“纯函数”的单子和“宏”的单子没有区别。
  • 要实现的基本思想是,具有未跟踪副作用的函数是一元的,与纯函数完全相同——因为你甚至无法区分两者之间的区别。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-18
  • 2015-12-20
  • 2010-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多