问题标签 [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.
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 项目!” )
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
自己?
lisp - 将文档字符串合并到 def* 宏中的正确方法?
我正在通过 Practical Common Lisp 工作。我得到了一个例子,你定义了一个与一些附加功能deftest
类似的宏。defun
这让我想到能够添加一个文档字符串会很好。我发现以下两项都有效,但其中一项更正确吗?是否有一种“正确”的方式来实现类似可选文档字符串的行为defun
?
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 val
s,并且 distinct 没用)
我相信来自这里但不完全理解编译器试图告诉我什么?