📜  LISP 中的变量

📅  最后修改于: 2022-05-13 01:54:58.250000             🧑  作者: Mango

LISP 中的变量

与其他语言类似,在 LISP 中,变量被命名为存储特定值的位置,但它们的声明方式与您在 C++ 或Java中声明变量的方式不同,即在将变量声明为 LISP 时无需提及变量的数据类型动态类型

LISP 支持两种类型的变量:

  1. 局部变量
  2. 全局变量

局部变量:

它们也称为词法变量,这些变量在特定函数内部定义,只有绑定形式中的代码才能引用它们,因为它们不能在该函数外部访问。函数的参数也是局部变量。

定义局部变量:

可以使用特殊运算符LET 创建新的局部变量。然后可以在 LET 的主体内使用这些变量。
使用 LET 创建变量的语法是:



(let (variable)
  body-of-expressions)

let 表达式有两部分

  • 第一部分包括创建变量和为其赋值的指令
  • 第二部分由一个 s 表达式列表组成

现在让我们使用上述语法创建局部变量

Lisp
(let ((x 10) (y 20) z)
  (format t "Local Variables :~%")
  (format t "x = ~a, y = ~a & z=~a~%" x y z))


Lisp
(defparameter *pencil-rate* 10
  "Pencil rate is set to 10")
  
(defun calc-bill (n)
  "Calculates the total bill by multiplying the number of pencils with its global rate"
  (* *pencil-rate* n))
  
(write (calc-bill 20))


这里我们为xy分配了初始值,对于z没有提供任何值,因此NIL将被设置为 z 的默认值。

输出 :

Local Variables :
x = 10, y = 20 & z=NIL

全局变量:

这些是具有全局作用域的变量,即您可以从程序的任何地方调用访问它们。在 LISP 中,全局变量也称为动态变量。

定义一个全局变量:

可以使用DEFVARDEFPARAMETER构造定义新的全局变量。两者的区别在于,DEFPARAMETER 总是分配初始值,而 DEFVAR 形式可用于创建全局变量而不给它赋值。

创建全局变量的语法是:

(defvar *name* initial-value
  "Documentation string")
  
(defparameter *name* initial-value
  "Documentation string")  

例子:

让我们创建一个全局变量,将铅笔的比率保存为*pencil-rate* ,并在一个函数的帮助下通过将铅笔总数乘以我们的全局变量来计算总账单 *铅笔率*。

Lisp

(defparameter *pencil-rate* 10
  "Pencil rate is set to 10")
  
(defun calc-bill (n)
  "Calculates the total bill by multiplying the number of pencils with its global rate"
  (* *pencil-rate* n))
  
(write (calc-bill 20))

输出:

200

定义全局变量以星号开头和结尾是一个正确的命名约定,因为全局变量可以在程序的任何地方访问,因此可以有同名的局部变量,因此为了避免这种偶然的可能性,使用了这个命名约定.例子。 *全球的*