我最近一直对DSL感到好奇,特别是如何在Lisp中实现它们,因为与其他选项相比,它看起来是小菜一碟。
寻找信息,我找不到任何证据,在李斯特在互联网上的非Lisp DSEL。
所以我的问题是:
- If the former is true: is this a common way to implement "non-lispy" DSELs?
发布于 2014-09-05 17:55:55
简短的版本:球拍做到了这一点。
更详细的:球拍,一个计划的后裔,有一个非常深思熟虑的故事在这里。一个Racket模块/文件可以以语言声明开始。
#lang algol60
..。然后文件的其余部分可以用给定的语言编写。(是的,algol60是内置于.)
为了开发您自己的语言,您需要编写一个作为语言规范的包,说明如何将该语言的语法扩展到底层语言的语法中(在本例中是Racket)。任何人都可以编写这样的包,然后分发它们以允许其他人用这种语言编写程序。有此类语言规范的例子,例如前面提到的algol 60的例子。
我想这正是你想要的?
ObDisclaimer:是的,我是个球拍开发商。
发布于 2014-09-05 11:26:55
如何实现编程语言的表面语言?您可以编写解析器或使用解析器生成器。你也可以在Lisp里这样做。
有许多用Lisp编写的通用语言和特定领域语言的示例--不使用s表达式语法。
历史上,第一个毫升 (定理证明器的扩展语言)是用Lisp编写的。麦西玛 (一种计算机代数语言)是用Lisp编写的。在许多情况下,存在某种“最终用户”,为此需要编写/支持非表达式语言。有时,有些语言是存在的,需要得到支持。
使用宏和读取宏,您可以实现某些语言或扩展Lisp语言。例如,使用read宏向Lisp添加JSON语法很容易。也是某种infix语法。XML (示例:XMLisp)。
发布于 2014-09-05 12:12:07
在Lisp中支持非Lisp语法DSL没有问题。正如Rainer所提到的,您需要使用一些解析器/解析器生成器库。一个很好的例子是绞杀,它用于解析标记(参见3bmd),也用于pgloader命令语言,这只是您询问的外部DSL的一个例子。
https://stackoverflow.com/questions/25683111
复制相似问题