适用于非纯语句中赋值语义的运算符

时间:2009-12-06 05:38:24

标签: language-design declarative

我正在设计一种用于定义信号网络的声明性语言。我想使用变量绑定来表示网络中的节点组。在我看来,我希望为这些变量做两种类型的“分配”。

一方面,变量应代表特定信号运算符组的输出。然后可以将此输出附加到另一个输入。这对于将不同的输出引导到不同的地方很重要,例如:

a, b, c = (SignalA with three outputs)
(SignalB a)
(SignalC c)
(SignalD a)

在这种情况下,会有一个带有三个输出的SignalA,其中第一个和第三个输出分别链接到SignalB和SignalC,SignalD也链接到SignalA的第一个输出。 SignalA只有一个实例。

另一方面,变量应代表信号操作的常见模式,因此很容易重现常见配置:

a = (SignalA (SignalB))
(SignalC a)
(SignalD a)

在这种情况下,我希望a代表SignalA和SignalB的组成,这是再现作为SignalC和SignalD的输入。这里有两个的SignalA实例。

所以我的问题是,在函数/声明性编程中,这两个赋值语义是否有共同的术语?在我的语言中,哪一个应该得到'=',哪一个是另一个的常见运算符? (也许:=?)

我当然意识到如果每个Signal真的代表一个函数,那么这两个函数都是相同的,但在我的情况下,当处理信号时可能会出现副作用,所以我需要区分这两种情况。

1 个答案:

答案 0 :(得分:0)

已经过了我的睡觉时间,所以我可能不会仔细阅读。但第二种情况类似于匿名函数吗?你的语法看起来已经像lisp一样了,所以我想知道lisp的lambda函数的快捷语法是否符合你的要求。

a = '(SignalA (SignalB))

如果你的用法与lambda的含义实际上并不相似,那么它可能会引起更多的混淆。

顺便说一下,在第一种情况下,你可以按照Perl的想法进行列表赋值的左侧: (a, b, c) = (SignalA with three outputs)

不知道这是否有用;我不是像Perl和C这样的命令式语言之外的经验。