问题标签 [defmacro]

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 投票
3 回答
519 浏览

haskell - 为什么我们不用 LISP 语法编写 haskell 呢?(我们可以!)

它...有点工作你们(这绝对编译,改编自https://hackage.haskell.org/package/scotty):

(我不知道足够的haskell 转换<>为简单的parens,但聪明的人可以很容易地。)

我们为什么要这样做?我们可以使用任何 lisp 宏引擎对 Haskell 进行预处理!琐碎!。

想象一下。HASKELL 和 LISP 在一起。我们可以统治银河!

在此处输入图像描述

(我知道你的想法,但我实际上已经考虑过了:在这个例子中,Vader 是 Lisp,Luke 是 Haskell,Yoda 是 Alonzo Church)

(编辑“感谢所有回答和评论的人,我现在更聪明了。我认为尚未提到的这种技术的最大问题,并被朋友 IRL 指出:如果你编写一些 lispy 预处理器,你在你的 IDE 和工具中失去类型检查和语法突出显示和理解。这听起来像是我的硬通行证。

“我现在正在关注https://github.com/finkel-lang/finkel项目,这是我想要的 lisp 风格的 haskell 项目!” )

0 投票
3 回答
184 浏览

common-lisp - Common Lisp 宏来扩展作为 rest 传递的参数列表,例如: (foo (expand bar 100 200 300)) => (foo (bar 100) (bar 200) (bar 300))

对不起,笨拙的标题,但我很难用几句话来描述我正在寻找的东西......

我正在开发一个 Common Lisp DSL 项目,我想知道以下是否可行:

DSL 可能有几个功能

(defun foo (&rest rest))

(defun bar (arg))

将按以下方式使用:

(foo (bar 100) (bar 200) (bar 300) (bar 400) (bar 500))等等

现在,这是很多多余的输入,所以我想知道是否可以创建一个扩展宏来允许

(foo (expand bar 100 200 300 400 500))

不改变foo自己?

0 投票
1 回答
76 浏览

lisp - 将文档字符串合并到 def* 宏中的正确方法?

我正在通过 Practical Common Lisp 工作。我得到了一个例子,你定义了一个与一些附加功能deftest类似的宏。defun这让我想到能够添加一个文档字符串会很好。我发现以下两项都有效,但其中一项更正确吗?是否有一种“正确”的方式来实现类似可选文档字符串的行为defun

0 投票
1 回答
125 浏览

scala - `Coder[P <: Product]`的Scala 2宏类型类派生以错误`P不带参数`结束

我是 Scala 2 Macros 的初学者(在我切换到 Dotty 之前),在尝试了无形类型类派生之后,我想更进一步,编写一个宏,可以为任何scala.Product没有它的类型生成类型类实例。

(为了举例,让我们忽略嵌套递归类型,所以我的目标是平面案例类。)

我的类型类是一个抽象类Coder[T](例如带有encode()/的特征decode())。

所以生成的代码为:

应该是这样的:

(删除了完全指定的类名以提高可读性)

在宏中,我尝试:

  • 检查weakTypeOf[P]
  • 遍历每个案例类构造函数字段(类型F
    • 隐式找到它们的类型类Coder[F]实例并将其添加到树中
    • 并将它们的encode()decode()表达式附加到有助于最终Coder[P]方法的树中。

但调用后出现错误sbt Test / compile

(在导入和隐式搜索方面有点挣扎,所以现在有中间private vals,并且 distinct 没用)

我相信来自这里但不完全理解编译器试图告诉我什么?

完整代码示例的链接可以在这里
找到 CI 错误的链接可以在这里找到。