Function 最适合实现此DSL的语言是什么?

Function 最适合实现此DSL的语言是什么?,function,hash,lambda,language-design,dsl,Function,Hash,Lambda,Language Design,Dsl,我想用一个非常简短的语法来编程DSL,我注意到这两件事对编程非常重要,函数和散列。这是我的设计: 创建哈希: (a:1 b:2 c:3) Same as JavaScript's: {a:1,b:2,c:3} 创建有序散列,忽略键: (x y 5) Same as JavaScript's: {0:'x', 1:'y', 2:5} 创建匿名函数: (a?) Same as JavaScript's: (function(x){ return x.a; }) Example applicat

我想用一个非常简短的语法来编程DSL,我注意到这两件事对编程非常重要,函数和散列。这是我的设计:

创建哈希:

(a:1 b:2 c:3)
Same as JavaScript's: {a:1,b:2,c:3}
创建有序散列,忽略键:

(x y 5) 
Same as JavaScript's: {0:'x', 1:'y', 2:5}
创建匿名函数:

(a?)
Same as JavaScript's: (function(x){ return x.a; })
Example application:
    ((test a? b?) (a:1 b:2 c:3))
    >> Outputs (test 1 2)
嵌套函数:

(a? a?') 
Same as JavaScript's: (function(obj1){ return function(obj2) { return [obj1.a,obj2.a]; }; })
Example double-application:
    (((a? a?') (a:1)) (a:2))
    Is reduced to: ((1 a?) (a:2))
    Then outputs: (1 2)

什么语言适合实现这样的DSL?

听起来你很喜欢一种带有强大宏系统的语言,比如某种方案。宏正好允许这种语法扩展,其中来自原始语言的代码片段可以嵌入到您提出的新形式中(我假设您希望能够说
(a:1+1b:2*2)
,等等)。此外,宏系统不会像外部预处理器那样使构建过程复杂化或破坏错误消息位置

但有一个坏消息,那就是我所知道的任何(非深奥的)语言的语法空间都不足以提供您指定的确切语法

下面是我想到的语法:

散列:

(:a1b2c3)
; 或者更清楚地说
(:(a1)(b2)(c3))
索引键控哈希:

(:lst'x'y 5)
(如果您允许在散列的RHS上使用裸字,那么引用变量将非常困难,因此我假设您不希望这样做)

匿名属性访问函数:

(a?)
Same as JavaScript's: (function(x){ return x.a; })
Example application:
    ((test a? b?) (a:1 b:2 c:3))
    >> Outputs (test 1 2)
(另一个名称)
与前一种方法类似,但通过对多个参数进行咖喱化,然后返回一个列表来获取多个参数:

(另一个名称)
好消息是,您不需要编写lexer或parser,也不需要在构建系统中到处乱动来将这种语法添加到Scheme中;这只是几行代码,导入语法就像导入函数一样

第一个宏(名为
)编写起来非常简单:

(定义语法规则(:(k v)…)
(使散列“((k,v)…))
第二个(名为
:lst
)更难,因为您需要生成索引。可能不到十行代码,但我懒得写它们

第三个宏(
anon.
)有点不平凡,但有点有趣,所以它是:

(定义语法)。
(语法规则()
((其他属性…)
(lambda(x)(cons(散列参考x'属性)(非属性…)
((不)
(空)
(注意,为了保持一致性,我假设您希望
anon.
始终返回一个列表;否则需要在
语法规则中添加一个额外的子句,以用于特殊情况。)我不确定
anon.
是否真的是一个有用的宏,但这是您和代码库之间的事


如果你想破解宏,我建议你试试我最喜欢的Scheme风格。它有一个特别面向宏的世界视图(参见Racket被称为“PLT Scheme”时写的内容)。

您希望如何执行这样一个程序?你想把它编译成一个可执行的二进制文件,用解释器解释它,或者把你的程序转换成其他的编程语言,让它在那里执行?最后一个选项,或者类似的东西。我想实现某种“短基础”,在这种基础上,我可以使我的语言在任何环境下都可以被注入,比如C++,JavaScript。我不确定这是否可行,所以,我想,任何目标都可以?任何能使实现我自己的语法更容易的语言都可以。要实现你自己的语法,你很可能需要为语言编写你自己的预处理器+你的添加,它将你的程序转换成目标语言。既然Javascript简化似乎是您想要的,那么您应该这样做。。。作为起点,您可以为某些解析器生成器获取Javascript语法,并将您的构造添加到其中。另一种尝试是(错误地)使用一些语言构造来实现您想要的行为。在这里我想到了C++及其函数操作符。