0

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

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

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 真的代表一个函数,那么这两种情况都是一样的,但是在我的情况下,处理信号时可能会出现副作用,所以我需要区分这两种情况。

4

1 回答 1

0

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

a = '(SignalA (SignalB))

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

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

不知道这是否会有所帮助;在 perl 和 C 等命令式语言之外,我没有那么丰富的经验。

于 2009-12-06T08:50:30.010 回答