维基百科说:
可扩展编程是计算机科学中用于描述一种计算机编程风格的术语,该风格侧重于扩展编程语言、编译器和运行时环境的机制。
例如,Tcl 允许您编写自己的控制结构。见这里。
我有兴趣编译一个在实际代码中使用的可扩展编程语言列表。如果您也可以为您的语言提供示例,那就太好了。
维基百科说:
可扩展编程是计算机科学中用于描述一种计算机编程风格的术语,该风格侧重于扩展编程语言、编译器和运行时环境的机制。
例如,Tcl 允许您编写自己的控制结构。见这里。
我有兴趣编译一个在实际代码中使用的可扩展编程语言列表。如果您也可以为您的语言提供示例,那就太好了。
Ruby 并不是严格意义上的可扩展语言,但其语法足够灵活和强大,如果你眯着眼睛看,它看起来就像是……对于许多用途来说,这已经足够好了。
无论如何,人们实际上使用 Ruby :-)
Jetbrains MPS(元编程系统)提供基于投影编辑器的可扩展语言工作台。它可以帮助您为您的语言扩展创建编辑器、类型系统、约束、重构和代码生成器。它附带一些 Java 语言实现和扩展。
mbeddr是利用该技术的 C 实现。它具有组件系统、发送/接收 + 客户端/服务器接口、依赖注入、状态机、测试和 PLE 扩展。它还包含一个可扩展的调试系统,因此您可以将扩展映射到 gdb 并提供舒适的调试体验。几乎整个 C 语言特性都被映射,因此代码生成主要可以通过简化为 C 构造而不是愚蠢的 M2T 转换来处理。
Aynth是一个简单的单声道合成器,使用 mbeddr 编写,用于演示组件和发送/接收接口。
无论如何,如果您使用它,您首先会注意到的是,在许多情况下,投影编辑不如文本编辑那么舒服。我们非常习惯基于文本的编辑。但是可扩展语言有很多好处。
Jeebox是一种可扩展的语言,可以描述任何东西,包括代码。
纯粹是用来形容事物的,现在...
但是一种可扩展的编程语言,可以很容易地建立在 Jeebox 之上。
(我在 Jeebox 之上构建了一种普通的、不可扩展的编程语言,仅仅是因为将可扩展性构建到编程语言中不仅仅是一种语言特性。它需要一种递归,您可以在其中编写可以创建更多代码的代码。正确地做到这一点需要比我可用的时间更多的时间。但是很高兴知道我使用的语言 Jeebox 可以支持这一点,一旦我有时间去做。)
Scala 也不是严格可扩展的,但您可以定义看起来像运算符的内容。例如,在定义地图时,您可以使用:
val romanNumeral = Map(
1 -> "I", 2 -> "II", 3 -> "III"
)
-> 实际上是在对象 1 上调用的方法,但看起来像一个运算符。
关于可扩展编程的 Wikipedia 文章提到了语言Seed7。Seed7 的维基百科文章将其描述为:
除了许多其他功能之外,它还提供了一种扩展机制。Seed7 支持将新语法及其语义引入语言,并允许使用 Seed7 语言本身定义新的语言结构。例如:程序员可以引入新语句的语法和语义以及用户定义的运算符符号。
Seed7 从头开始被设计为可扩展的语言。整个语言在编译器中没有硬编码。相反,Seed7 是在库中定义的,这些库在程序编译时被加载。恕我直言,Seed7 是唯一一种将可扩展性作为基本特性而其他一切都基于它的语言。其他方法使用传统语言,其中编译器使用硬编码语法和语义分析,并在其上添加一些扩展机制。
Tcl 的精神是“一切都是字符串”,“一切都是命令”,甚至是控制流构造。
例如,让用自定义循环替换 while 循环。
# rename original while to orig_while for future usage.
rename while orig_while;
#redefine while
proc while {cond body} {
# add customization code
# calculate while call count.
global while_call_count;
incr while_call_count;
# call original while in uper level stack
uplevel orig_while $cond $body;
# add customization code
}