CL/Scheme DSEL具有非lisp语法

Ger*_*ago 2 dsl scheme common-lisp

我最近对DSL很感兴趣,特别是如何在Lisp中实现它们,因为它看起来像是替代品中的小菜一碟.

寻找信息我在互联网上的Lisp中找不到任何非lisp DSEL的证据.

所以我的问题是:

  • 是否可以使用宏在lisp中实现具有非lisp语法的DSL?
  • 这是如何实现的?

  • lisp的读者可以用自定义读取器替换,将代码转换为lisp结构吗?

    • 如果前者是真的:这是实现"非lispy"DSEL的常用方法吗?

Rai*_*wig 7

你如何实现编程语言的表面语言?您编写解析器或使用解析器生成器.你也可以在Lisp中做到这一点.

有许多用Lisp编写的通用和领域特定语言的例子 - 不使用s表达式语法.

历史上第一个ML(定理证明器的扩展语言)是用Lisp编写的.Macsyma(计算机代数的一种语言)是用Lisp编写的.在许多情况下,存在某种"最终用户",需要为其编写/支持非s表达式语言.有时存在并且需要支持的语言.

使用宏和读取宏可以实现某些语言或扩展Lisp语言.例如,使用读取宏很容易将JSON语法添加到Lisp.还有某种中缀语法.XML(例如:XMLisp).


Joh*_*nts 7

简短版本:Racket这样做.

更详细:Racket是Scheme的后代,在这里有一个经过深思熟虑的故事.Racket模块/文件可以以语言声明开头,例如

#lang algol60

...然后文件的其余部分可以用给定的语言编写.(是的,algol60是内置的.)

为了开发自己的语言,您需要编写一个语言规范包,该包展示了如何将该语言的语法扩展为底层语言的语法(在本例中为Racket).任何人都可以编写这样的包,然后分发它们以允许其他人用这种语言编写程序.Racket中包含此类语言规范的示例,例如前面提到的algol 60示例.

我想这正是你所要求的?

ObDisclaimer:是的,我是一名球拍开发者.