2

我正在寻找创建一个 DSL 并且我正在寻找一种语言,您可以在其中定义自己的括号式运算符,用于诸如地板和天花板功能之类的事情。我宁愿不去为自定义语法定义我自己的 Antlr 解析器。

据我所知,我所知道的唯一允许您定义自定义运算符的语言都是二进制中缀运算符。

tl; dr:哪些语言允许定义成对符号(如左括号/右括号)运算符?


另外,如果没有人命名具有此功能的单一语言并且标准非常具体并且绝对在编程领域中,我看不出这个问题如何“过于宽泛”。

4

1 回答 1

3

由于 Fortress 已经死了,我所知道的唯一可以想象这种事情的语言是 FORTH 遗产的语言。

在我所知道的所有其他内容中,大括号、方括号和圆括号已经被大量使用,并且不能进一步超载。

我建议放弃对这些东西的追求,让写作变得舒服

floor x
ceiling y

或者,功能应用程序以您选择的语言表达。

但是,在您引用的文章中,据说:Unicode 在 U+2308–U+230B 处包含这些符号的代码点:⌈x⌉,⌊x⌋。

因此,您至少可以在类似 Haskell 的语言中将其定义为运算符并使用如下:

infix 5 ⌈⌉
(foo ⌈⌉)

我能想到的最好的方法如下:

--- how to make brackets
module Test where

import Prelude.Math

infix 7 `«`
infix 6 `»`

_ « x = Math.ceil x
(»)     = const

x = () «2.345» ()

main _ = println x

输出为:3.0(这实际上不是 Haskell,而是 Frege,一种类似 Haskell 的 JVM 语言。)

请注意,我使用 «» 而不是 ⌈⌉,因为不知何故,我的 IDE 中没有可以正确显示括号符号的字体。(这是不这样做的另一个原因。)

它的工作方式是使用infix指令,我们将其解析为

 (»)  ((«) () 2.345)  ()

(可以插入任何表达式来代替()

也许如果您在 Haskell 小组中提问,有人会找到更好的解决方案。

于 2013-11-14T16:30:33.257 回答