小编Fox*_*oxy的帖子

解析自定义中缀运算符 + 使用 FParsec 实现

我对“真正的解析器”(例如 F# 或 Haskell)解析自定义运算符的方式有点困惑。对于“普通”语言,我们只需定义一个 AST 节点,在该节点上有预定义的运算符可能性,例如:+, -, *, ==, >=, +=, ... 等。

\n\n

但我想知道如何使用允许您创建自定义运算符的函数式语言来完成此操作,让我们以 OCaml 为例,它与 F#(我的实现语言)非常接近,并且众所周知。

\n\n

因此,每个运算符都是一个函数,具有类型和定义,我们可以创建自己的运算符:

\n\n
val (+) : \'a -> \'a -> \'a\nlet (+) x y = x + y\n\nval (|>) : \'a -> (\'a -> \'b) -> \'b\nlet (|>) x f = f x\n
Run Code Online (Sandbox Code Playgroud)\n\n

所以我想知道它是如何与解析一起工作的。

\n\n

1)解析器如何知道我们要使用自定义运算符?如果我们使用的函数在第一个参数中采用另一个函数,在第二个参数中采用另一个元素,那么它如何知道我们调用的是函数而不是使用中缀运算符?

\n\n
let example x =\n    // Do we add up, or do we call the function "takeOpAndOther"?\n    takeOpAndOther …
Run Code Online (Sandbox Code Playgroud)

f# parsing ocaml operators fparsec

4
推荐指数
1
解决办法
947
查看次数

纯粹的面向对象语言应该被"广泛"使用?

我所知道的最面向对象的语言是Smalltalk.与其他语言相比,它的独特之处在于将所有内容定义为对象.

但是(如果我们不考虑历史事件),是不是这种特殊性使它成为一种比大多数其他面向对象语言(Java,C++,Python,......)更少使用的语言?

今天最常用的面向对象语言并不是纯粹的,因此学习它们相对容易(如果不考虑范式,它们与C类似的不同),使用外部元素( API,C库,DLL,...),或者使用类创建自己的对象(我们将更多地讨论面向类的编程).

所以我的印象是大多数面向对象的语言都不遵循原始OOP的"哲学"(我错了吗?).

然后我想知道纯粹面向对象的语言是否可以像这种范例中的大多数语言一样被广泛使用,以及使这种语言不能与其环境隔离的特征应该是什么(这是不可能的例如,在Smalltalk中使用C库)?

oop paradigms smalltalk object

0
推荐指数
1
解决办法
88
查看次数

标签 统计

f# ×1

fparsec ×1

object ×1

ocaml ×1

oop ×1

operators ×1

paradigms ×1

parsing ×1

smalltalk ×1