Scheme 编程/使用变量
外观
为了使您的程序更具动态性,通常需要声明一个变量。 有两种主要的方法,使用 define
和 let
。 两者的区别一旦完全掌握就很容易理解。
例如,使用 define
> (define x 2)
#<unspecified>
> (* x 3)
6
> x
2
这表明即使变量 x
被使用过,它仍然存在,它被定义为所有人都可以查看、使用和(正如我们将在后面看到)随意修改。
一般来说,变量的 define 语句的形式如下
(define <variable name> <variable value>)
现在我们将看到 let
的用法
> (let ((x 2) (y 4)) (* x y))
8
> x
;ERROR: "/usr/lib/scm/Iedline.scm": unbound variable: x
> y
;ERROR: "/usr/lib/scm/Iedline.scm": unbound variable: y
注意这里,当代码块执行完毕后,变量 x
和 y
将不再可用。 现在,这是一种非常笨拙和缓慢的方法,但它允许在以后编写更优雅的程序。
一般来说,let 语句的形式如下
(let ((var1 val1) ... (varn valn)) (<body>))
Scheme 中的变量是动态类型的,因此在定义变量时无需声明变量的类型。 此外,如果您想更改变量的值,您可以将其更改为任何您喜欢的值 - 相同的变量可以保存任何类型的数据。 当一个函数返回两种不同类型的值,而您希望存储结果在一个变量中而不管结果是什么时,这将很有益。
(define f
(lambda(x)
(cond
((= x 3) 5)
(else "Error: Invalid input!"))))
(define y (f 5))
如果我们使用的是像 Java 这样的语言,它使用静态类型,这是不允许的。 正如示例所示,动态类型的常见用法是让一个函数返回一种类型的值(例如数字)如果函数调用成功,则返回另一种类型的值(这里是一个字符串)如果函数失败。 当然,尽管有动态类型,但诸如尝试将两个符号相乘之类的逻辑操作仍然会失败,因此当一个函数返回两种可能类型时,请确保在尝试使用它之前确定实际返回的值的类型。