变量和函数
在CindyScript中,变量和函数没有显式声明。它们是按需创建的,没有显式类型。这与许多其他编程语言形成鲜明对比。在本节中,您将了解在什么情况下可以创建函数和变量。您还将学习如何销毁或清除变量及其范围。
定义函数
在CindyScript中定义函数非常简单。只需指定函数的名称,提供参数列表,并写下函数的主体。不需要显式键入参数或函数值。在下文中,我们提供了一些简单函数的示例。例如,函数(f)
由定义
计算第一个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个
值三
,至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));
产生输出
的返回值时间a(2)
取决于(全局)变量的实际值一
在计算函数时。所以在重新定义之后一
函数的行为时间
变化。有时这种效果是有意的,有时不是。可能有人想冻结函数的行为,以依赖于定义函数时变量的值。这可以通过使用操作员来实现::=
定义函数。此运算符复制整个变量赋值并将其绑定到函数。因此,该程序
a=3;时间a(x)::=x*a;println(时间a(2));a=5;println(时间a(2));
产生输出
每次调用函数时一
已恢复。这个绑定过程不仅扩展到函数本身中使用的所有变量。它扩展到全部的可能与函数执行相关的变量。
有一种方法可以故意绕过此绑定:一
可以使用修饰符显式设置。其示例可以在以下代码中看到:
a=3;时间a(x)::=x*a;println(时间a(2));println(时间a(2,a->10));
这个程序片段产生以下输出
预定义常量
在数学中,通常需要使用数学常数,如圆周率
或假想单位我
。这些常量在CindyScript中预定义为变量。这允许写入复数,例如3+i*5
但是,可以为这些变量分配不同的值。例如,仍然可以将这些变量用作循环中的运行变量。以下程序说明了此功能:
println(i);重复(4,i,println(i));println(i);
它产生以下输出:
例如,如果需要复杂的单位,但需要变量我
被重写,则仍然可以使用该功能访问复杂单元复数([0,1])
。其他预定义变量包括真的
和假
对于逻辑常数以及空列表,无
.
还有另一种重要类型的预定义变量。构造中的任何几何元素都可以称为具有相应名称的预定义变量。例如,一个点A类可以使用变量访问A类
。有关此主题的更多详细信息,请参阅访问几何元素.
用户定义数据
还可以将用户定义的数据与几何元素相关联。这可以通过:
操作员。这是一个简单但非常强大的功能。在冒号之后,可以添加任意字符串值作为访问数据的键。此键用作可附加任意值的变量。
这个操作符的用法最好用一个例子来解释。假设A类广告B类是几何对象。以下代码将一些数据与它们关联:
A: “年龄”=17岁;B: “年龄”=34;A: “发色”=“棕色”;B: “haircolor”=“金发”;
可以使用相同的密钥访问数据。所以下面的代码
对于所有(allpoints(),p,println(p:“年龄”);println(p:“发色”);)
将产生输出
可以通过访问几何对象的所有键的列表键(…)
操作员。所以在上面的示例中,代码
将产生以下输出:
还可以将关键信息附加到列表中。通过此操作,还可以创建由变量传递的自定义数据。下面的代码演示了这种行为。
a=[];a: “数据”=18打印(a:“数据”)
注意:附加关键数据的功能仍可能更改。计划支持类似对象的数据结构。因此,当前实现的功能可能与未来版本不兼容。