Common Lisp中的类型为何属于一等对象?需结合SICP准则说明
Common Lisp中的一等类型:基于SICP判定条件的演示
彼得·诺维格曾提出著名观点:许多OOP设计模式在Lisp中多余或无关紧要,其相关文档第10页指出,一等类型可替代其中诸多模式。
Common Lisp中的类型在何种意义上属于一等对象?我们参考《计算机程序的构造和解释》(SICP)中一等对象的判定条件:
- 可被变量命名
- 可作为参数传递给过程
- 可作为过程的返回结果
- 可被包含在数据结构中
下面我们逐个演示Common Lisp类型如何满足这些条件:
1. 可被变量命名
在Common Lisp中,类型可以直接赋值给变量,比如将内置类型integer绑定到变量my-type:
(defvar my-type 'integer) ;; 验证变量指向的类型 (typep 42 my-type) ; 返回 T
2. 可作为参数传递给过程
类型可以作为参数传给自定义或内置过程,比如写一个检查值是否属于指定类型的函数:
(defun check-type-match (value target-type) (typep value target-type)) (check-type-match "hello" 'string) ; 返回 T (check-type-match 100 'float) ; 返回 NIL
3. 可作为过程的返回结果
过程可以将类型作为返回值,比如根据输入值动态返回对应的类型:
(defun get-value-type (value) (type-of value)) (get-value-type 3.14) ; 返回 SINGLE-FLOAT (get-value-type '(a b c)) ; 返回 CONS
4. 可被包含在数据结构中
类型可以存入列表、哈希表等数据结构中,比如创建一个包含多种类型的列表:
(defvar type-collection '(integer string cons hash-table)) ;; 遍历列表检查类型 (dolist (type type-collection) (print (typep 123 type))) ;; 输出依次为 T、NIL、NIL、NIL
内容的提问来源于stack exchange,提问作者J. Mini
相关产品推荐
相关产品推荐

