变量和函数

打印

变量和函数


在CindyScript中,变量和函数没有显式声明。它们是按需创建的,没有显式类型。这与许多其他编程语言形成鲜明对比。在本节中,您将了解在什么情况下可以创建函数和变量。您还将学习如何销毁或清除变量及其范围。


定义函数



在CindyScript中定义函数非常简单。只需指定函数的名称,提供参数列表,并写下函数的主体。不需要显式键入参数或函数值。在下文中,我们提供了一些简单函数的示例。例如,函数(f)由定义

f(n):=总和(1..n,i,i^2)


计算第一个n个方块。例如,在这个定义之后,f(4)计算结果为30.

具有多个参数的函数可以类似地进行定义。以下函数假定b条是二维向量,绘制一个正方形,其边缘由这两个向量定义:

平方(a,b):=(n=(b-a);n2=(-n2,n1);提取(a,b);绘制(a,a-n2);绘制(b,b-n2);绘制(a-n2,b-n2);)


在这段代码中,发生了一些有趣的事情。首先,该准则原则上是程序性的。函数体具有以下形式(语句_1;…;语句_k)此外,该函数使用变量n个氮气。这些变量是在首次调用函数时创建的。但是,它们(默认情况下)不是本地的。调用函数后,它们的值也可见。

函数的返回值是函数中最后一个求值语句的值。因此,以下函数计算三个条目的算术平均值。

平均值(a、b、c):=(总和=a+b+c;总和/3;)


由于函数没有显式类型,因此也可以将更复杂的对象作为函数的参数传递。该函数自动地尽可能多地多态,仅受函数中使用的操作的通用性限制。例如,平均值([3,4],[2,7],[4,7])计算结果为[3,6].


递归函数



函数也可以递归定义。然后为每个递归级别创建每个函数参数的新实例。以下代码计算数字的阶乘:

fac(n):=如果(n==0,1,n*fac(n-1));


以下更复杂的代码计算两个正数的最大公约数:

gcd(a,b):=如果(b==0,//达到递归结束a、 //然后返回数字aif(b>a,//可能是开关参数gcd(b,a),//切换版本gcd(b,mod(a,b))//递归));



定义变量



CindyScript中的变量在代码中首次出现时定义。一旦定义,变量在程序的其余部分中仍然可以访问。变量可以包含任何类型的对象(数字、字符串、布尔值、列表、几何点,甚至程序等)。程序

x=3;b=[x^2,x^3];c=2*b;


分配给x个,至b条[9,27]、和至c(c)[18,54]。在函数中定义的变量也在函数范围外保持可见。此规则的例外情况是函数的参数和显式定义的局部变量。以下程序举例说明了变量的范围:

f(x):=(x=x+x;println(x);y=“用户”);x=“你好”;y=“世界”;打印ln(x+y);f(x);打印ln(x+y);


它产生输出

你好,世界你好你好你好,用户


函数中的局部变量可以使用区域(…)操作员。
当函数终止时,它们会自动删除。
在下面的代码片段中,作为上述程序的一个微小变化,被定义为函数中的局部变量:

f(x):=(区域(y);x=x+x;println(x);y=“用户”;);x=“你好”;y=“世界”;打印ln(x+y);f(x);打印ln(x+y);


程序生成输出

你好,世界你好你好你好,世界


循环中的运行变量也被视为局部变量。

将变量绑定到函数


函数中的变量(除非定义为局部变量)保持可见
函数执行后。此外,函数中使用的变量
可能具有影响函数求值的初始值。

例如,下面的代码

a=3;时间a(x):=x*a;println(时间a(2));a=5;println(时间a(2));


产生输出

610


的返回值时间a(2)取决于(全局)变量的实际值在计算函数时。所以在重新定义之后函数的行为时间变化。有时这种效果是有意的,有时不是。可能有人想冻结函数的行为,以依赖于定义函数时变量的值。这可以通过使用操作员来实现::=定义函数。此运算符复制整个变量赋值并将其绑定到函数。因此,该程序

a=3;时间a(x)::=x*a;println(时间a(2));a=5;println(时间a(2));


产生输出

66


每次调用函数时已恢复。这个绑定过程不仅扩展到函数本身中使用的所有变量。它扩展到全部的可能与函数执行相关的变量。

有一种方法可以故意绕过此绑定:可以使用修饰符显式设置。其示例可以在以下代码中看到:

a=3;时间a(x)::=x*a;println(时间a(2));println(时间a(2,a->10));


这个程序片段产生以下输出

620


预定义常量


在数学中,通常需要使用数学常数,如圆周率或假想单位。这些常量在CindyScript中预定义为变量。这允许写入复数,例如3+i*5但是,可以为这些变量分配不同的值。例如,仍然可以将这些变量用作循环中的运行变量。以下程序说明了此功能:

println(i);重复(4,i,println(i));println(i);


它产生以下输出:

0+i*11240+i*1


例如,如果需要复杂的单位,但需要变量被重写,则仍然可以使用该功能访问复杂单元复数([0,1])。其他预定义变量包括真的对于逻辑常数以及空列表,.

还有另一种重要类型的预定义变量。构造中的任何几何元素都可以称为具有相应名称的预定义变量。例如,一个点A类可以使用变量访问A类。有关此主题的更多详细信息,请参阅访问几何元素.

用户定义数据


还可以将用户定义的数据与几何元素相关联。这可以通过:操作员。这是一个简单但非常强大的功能。在冒号之后,可以添加任意字符串值作为访问数据的键。此键用作可附加任意值的变量。

这个操作符的用法最好用一个例子来解释。假设A类广告B类是几何对象。以下代码将一些数据与它们关联:

A: “年龄”=17岁;B: “年龄”=34;A: “发色”=“棕色”;B: “haircolor”=“金发”;


可以使用相同的密钥访问数据。所以下面的代码

对于所有(allpoints(),p,println(p:“年龄”);println(p:“发色”);)


将产生输出

17棕色的34金发女郎


可以通过访问几何对象的所有键的列表键(…)操作员。所以在上面的示例中,代码

打印(按键(A));


将产生以下输出:

[“年龄”、“发色”];



还可以将关键信息附加到列表中。通过此操作,还可以创建由变量传递的自定义数据。下面的代码演示了这种行为。

a=[];a: “数据”=18打印(a:“数据”)


注意:附加关键数据的功能仍可能更改。计划支持类似对象的数据结构。因此,当前实现的功能可能与未来版本不兼容。

此页面的参与者:冯·盖格恩,科尔滕坎普里希特.
页面上次修改时间:2015年2月9日星期一[13:59:50 UTC]冯·盖格恩.

本页面上的内容根据许可证.


菜单