是否有一种编程语言,您可以在其中设置自己的语法配置,并将代码转换为您选择的语言?
例如,您将选择特定的配置,例如“ Python的索引块”,[a,b,c]
初始化数组,^
求幂等。脚本会将其转换为您选择的语言的等效语言。
是否有一种编程语言,您可以在其中设置自己的语法配置,并将代码转换为您选择的语言?
例如,您将选择特定的配置,例如“ Python的索引块”,[a,b,c]
初始化数组,^
求幂等。脚本会将其转换为您选择的语言的等效语言。
Answers:
是的,但可能不是您的思维方式。
Lisp及其亲戚具有强大的宏系统,可让您在源上执行任意转换,因此原则上您可以使用宏(以及字符级别的阅读器宏)来进行您喜欢的任何扩展。串联语言(以及相关领域作者的语言)具有类似的元编程能力。Forth就是一个很好的例子,其中许多语法结构(例如注释)可以由用户定义。对于一个当代的,非深奥的示例,还努力为用户定义的语法提供优于Perl 5的Perl 6支持。
operator[]
多个参数的重载或像Haskell中引入新的运算符),那将是很好的。但是我怀疑委员会是否会解决解析问题。
听起来像是概念编程。
我不熟悉它,但是XL是专门为它设计的语言。
XL具有程序员可重新配置的语法和语义。编译器插件可用于向语言添加新功能。
Lisp和Forth还支持概念编程,尽管少于XL。我建议使用Lisp,因为它非常实用且有效。最重要的是Lisp提供的清晰灵活的语法(表示法)。
例如,您将选择特定的配置,例如“ Python的索引块”,“ [[a,b,c]””初始化数组,“ ^”表示求幂等。
您可能对Haskell这样的语言感兴趣,该语言具有非常灵活但统一的语法。
据我所知。
我也不认为这是一个特别好的主意-标准语言语法的主要好处之一就是很多人都可以阅读它,而且如果每个人都发明了自己的语法,那么没人会理解其他人的代码。 ....因此,这种语言对于业余爱好者可能很有趣,但对于任何实际的用途却没有太多用处。
现有的最接近的东西可能是Lisp,宏系统允许您以非常灵活的方式编写自己的新语言结构。通常,您仍然会坚持使用Lisp语法,但是如果您确实愿意的话,可以有效地重新定义所有内容。
结果,Lisps在实现DSL方面特别受欢迎。一个很好的例子是Clojure(Korma)中的此数据访问DSL,它负责数据库访问所需的所有样板代码。
Scala通常以这种方式用于创建DSL(特定领域语言)。
这主要是因为Scala没有运算符,并且Scala方法调用语法可以缩写。例如:
5是一个整数对象。要计算5加7,您可以编写
val ans = 5.add(7),不同之处在于加法方法实际上被命名为“ +”,因此您将编写:
val ans = 5。+(7),但在Scala中,不需要包括“。”。在方法调用中或在参数周围加上括号“()”,以便在对象5上调用+方法,您将编写
val ans = 5 + 7,因为Scala没有运算符来干扰您的聪明方法命名方案,所以效果很好。现在将该思想扩展到您自己的类和对象,包括以下事实:您可以“覆盖” +之类的方法,也可以创建自己的名为>>>或::的方法!或@ * @或仅纯文本名称(例如fancify)。
并不是说您应该使用它,因为它仍然主要是实验性的,但是最近一个有趣的编程范例是面向语言的编程(LOP)。
面向语言编程的概念采用这种方法来捕获用户术语中的需求,然后尝试创建一种与用户描述尽可能同构的实现语言,以便需求与实现之间的映射尽可能直接。
谢尔盖·德米特里耶夫(Sergey Dmitriev)更详细地说明了这一点。
那是它的意识形态,但实际上归结为它支持您所要求的行为。您可以:
我知道遵循此范例的最活跃的编程环境是JetBrains提供的免费元编程系统(MPS)。
实际上,它也已经开始在商业软件中使用,因此也许已经摆脱了“实验”阶段:
特定领域的语言在Tcl社区中非常普遍。例如,看到一个同时包含C和SQL作为嵌入式DSL(通过Critcl和Sqlite软件包)的Tcl程序并不少见。关于嵌入式DSL的唯一限制是,如果嵌入式语言平衡其大括号,那就更好了,这实际上在实践中是一项真正的繁重要求!
另一种使DSL变得容易的语言是Standard ML,它使您可以从通用系统令牌生成器(从将标识符转换为关键字的那一刻之前)访问原始令牌。这使得编写各种DSL变得容易,只要它们遵守SML的一些基本语法规则,尤其是与注释,字符串和令牌边界有关的规则,并且实际上已在该语言的许多关键驱动应用中大量使用(定理证明等)
并非所有语言都使此操作如此容易。特别是,自动解析括号项(其中很多!)的内容的语言无法做到这一点,因此它们要求DSL必须由优先级较高的运算符通过将子语言放在字符串中来构建,或者通过使用预处理器将DSL重写为可以在宿主语言中处理的东西。
有一个很好的预处理器叫做PPWizard,功能很强大。一旦了解了它的语法,就可以创建针对不同语言的宏定义-并不是说它是万无一失的或有趣的,但是它是一个有用的工具。
可能您正在寻找的是编译器。编译器编译器采用以正式语言编写的语言定义,并为此语言创建一个编译器。