真正的陈述性语言?

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除外)这样做?也许我在提到的语言中没有做到这一点,或者我完全错过了这样做的应用程序.

我制作了一个语言/应用程序原型(以及其他一些东西)并且正在考虑将其产品化.我简直不敢相信它还没有.不想浪费我的时间.

Mau*_*Mau 17

任何约束编程系统都会为您做到这一点.具有相关语言的CP系统的示例是ECLiPSe,SICSTUS Prolog/CP包,Comet,MiniZinc,......


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!:)

  • 嗯......我理解你在这里提出的建议,这已经是最受欢迎的答案......但我不认为这个答案符合问题的精神.括号()的必要性用螺栓固定在Z标识符和lambda上只是另一种语法解决方法.我认为他的问题更多的是询问是否存在一种具有"运行时"的语言,该语言优雅地管理每个变量背后的依赖链,同时还智能地检测循环引用 - 基本上他在没有UI的情况下要求Excel. (2认同)

ken*_*ytm 9

在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)不同.前者将评估的表达式绑定到变量,后者绑定评估的表达式.


Nor*_*sey 5

想要有两个X定义本质上必要的.在真正的声明性语言中,您可以在单个范围内对变量进行单一定义.您希望从Excel中执行的操作对应于编辑程序.

  • 并不是说我相信我在维基百科上读到的任何东西,但维基百科说"没有控制流".对X的多次分配需要控制流程 - 一个必须先于另一个. (5认同)