gjv*_*amp 21 programming-languages domain-driven-design functional-programming lazy-evaluation
有谁知道一种真正的声明性语言?我正在寻找的行为类似于Excel所做的,我可以在哪里定义变量和公式,并在输入发生变化时更改公式的结果(没有自己再次设置答案)
我正在寻找的行为最好用这个伪代码显示:
X = 10 // define and assign two variables
Y = 20;
Z = X + Y // declare a formula that uses these two variables
X = 50 // change one of the input variables
?Z // asking for Z should now give 70 (50 + 20)
Run Code Online (Sandbox Code Playgroud)
我已经尝试过很多语言,比如F#,python,matlab等,但是每次尝试这个都会得到30而不是70.从命令的角度来看,这是正确的,但我正在寻找一个如果你知道我的意思,更多的角色行为.
这只是一个非常简单的计算.当事情变得更加困难时,它应该自动处理诸如递归和memoization之类的东西.
下面的代码显然可以在C#中运行,但它只是为了工作的代码,我正在寻找更多的东西,没有那些"技术噪音"
class BlaBla{
public int X {get;set;} // this used to be even worse before 3.0
public int Y {get;set;}
public int Z {get{return X + Y;}}
}
static void main(){
BlaBla bla = new BlaBla();
bla.X = 10;
bla.Y = 20;
// can't define anything here
bla.X = 50; // bit pointless here but I'll do it anyway.
Console.Writeline(bla.Z);// 70, hurray!
}
Run Code Online (Sandbox Code Playgroud)
这看起来像是如此多的代码,花括号和分号,什么也没有添加.
是否有语言/应用程序(Exel除外)这样做?也许我在提到的语言中没有做到这一点,或者我完全错过了这样做的应用程序.
我制作了一个语言/应用程序原型(以及其他一些东西)并且正在考虑将其产品化.我简直不敢相信它还没有.不想浪费我的时间.
Dan*_*ker 15
看起来你只想让Z存储一个函数而不是一个值.在C#中:
var X = 10; // define and assign two variables
var Y = 20;
Func<int> Z = () => X + Y; // declare a formula that uses these two variables
Console.WriteLine(Z());
X = 50; // change one of the input variables
Console.WriteLine(Z());
Run Code Online (Sandbox Code Playgroud)
所以你?的()-prefix 语法的等价物是-suffix,但是它是相同的.lambda是你术语中的"公式".
在幕后,C#编译器几乎完全构建了您在C#概念示例中所呈现的内容:它X在编译器生成的类中生成一个字段,并在输入代码块时分配该类的实例.所以恭喜你,你重新发现了lambdas!:)
在Mathematica中,您可以这样做:
x = 10; (* # assign 30 to the variable x *)
y = 20; (* # assign 20 to the variable y *)
z := x + y; (* # assign the expression x+y to the variable z *)
Print[z];
(* # prints 30 *)
x = 50;
Print[z];
(* # prints 70 *)
Run Code Online (Sandbox Code Playgroud)
运算符:=(SetDelayed)与=(Set)不同.前者将未评估的表达式绑定到变量,后者绑定评估的表达式.
想要有两个X定义本质上是必要的.在真正的声明性语言中,您可以在单个范围内对变量进行单一定义.您希望从Excel中执行的操作对应于编辑程序.
| 归档时间: |
|
| 查看次数: |
1486 次 |
| 最近记录: |