CLISP 实现记录:5.数据和控制流
5.1 广义的引用(Generalized Reference)
&KEY 标识允许出现在 DEFSETF lambda列表中, 但是对应的关键字也必须出想在程序文本中.任何试图去修改只读数据都会发出一个 ERROR. 从文件里载入的程序文本还有引用常量都被认为是只读数据. 这个检测只为字符串执行, 不包括cons, 其他类型的数组, 还有用户定义的数据类型.也见 Section 31.11.2, “Macros EXT:LETF & EXT:LETF*”.
5.2 setf的展开(Setf Expansions)
(GET-SETF-EXPANSION form &OPTIONAL environment), (EXT:GET-SETF-METHOD form &OPTIONAL environment), 还有 (EXT:GET-SETF-METHOD-MULTIPLE-VALUE form &OPTIONAL environment) 都接受一个可选的参数 environment ,这里的environment在宏展开时是很有必要的. 在 DEFINE-SETF-EXPANDER 和 EXT:DEFINE-SETF-METHOD lambda 列表 中, 可以指定一个 &ENVIRONMENT 和一个变量, 这个变量会绑定给 environment. 这个 environment 应该被传递给 所有的 GET-SETF-EXPANSION, EXT:GET-SETF-METHOD 和 EXT:GET-SETF-METHOD-MULTIPLE-VALUE 调用. 如果这个被执行了, 甚至本地的宏会被解释为适当的 place.
5.3 place的种类(Kinds of Places)
另外 places:FUNCALL(SETF (FUNCALL #'symbol ...) object) 和 (SETF (FUNCALL 'symbol ...) object) 等价于 (SETF (symbol ...) object).PROGN(SETF (PROGN form ... place) object)LOCALLY(SETF (LOCALLY declaration ... form ... place) object)IF(SETF (IF condition place1 place2) object)GET-DISPATCH-MACRO-CHARACTER(SETF (GET-DISPATCH-MACRO-CHARACTER ...) ...) 调用 SET-DISPATCH-MACRO-CHARACTER.EXT:LONG-FLOAT-DIGITS:(SETF (EXT:LONG-FLOAT-DIGITS) digits) 设置默认的 LONG-FLOAT 尾数长度为 digits 位.VALUES-LIST(SETF (VALUES-LIST list) form) 等价于 (VALUES-LIST (SETF list (MULTIPLE-VALUE-LIST form))).注意注意这个 place 是受限的: 它只能用于 SETF, EXT:LETF, EXT:LETF*, 不能用于其他的.
5.4 Miscellaneous
函数 FUNCTION-LAMBDA-EXPRESSION一个 FFI:FOREIGN-FUNCTION 的名字是一个字符串 (下层 C 函数的名字), 不是一个lisp function name.宏 DESTRUCTURING-BIND这个宏不会去执行全部的错误检查.宏 PROG1, PROG2, AND, OR, PSETQ, WHEN, UNLESS, COND, CASE, MULTIPLE-VALUE-LIST, MULTIPLE-VALUE-BIND, MULTIPLE-VALUE-SETQ这些宏被实现为特殊操作符 (被 [sec_3-1-2-1-2-2] 许可的) , 所以它们的性能很高.
5.5 宏 DEFCONSTANT
这个初始值不会在编译时求值, 就像 DEFVAR 和 DEFPARAMETER. 如果你在编译的时候需要这个值就使用 EVAL-WHEN .constant variables 可能不会被动态或者词法绑定.也见 Section 3.3.2, “Declaration EXT:CONSTANT-NOTINLINE”.如果你需要去撤销一个 DEFCONSTANT 结构的影响, 声明这个符号为 SPECIAL (去把一个常量转化为动态变量), 然后声明它为 EXT:NOTSPECIAL (把这个动态变量转化为词法变量).注意如果你遵守通常的变量命名规则 ( DEFVAR 和 DEFPARAMETER 为*FOO* ,DEFCONSTANT 为 +BAR+ , LET/LET* 为 ZOT), 你会为自己减少很多麻烦. 也见 Q: A.4.14.
5.5.1. 变量 CUSTOM:*SUPPRESS-SIMILAR-CONSTANT-REDEFINITION-WARNING*
如果被 DEFCONSTANT 定义的变量已经绑定一个值,它不和新的值 EQL , 会发出一个 WARNING . 然而,如果新值看上去和旧值相似 (打印为同一个字符串, 就像重复加载文件那样), 可以通过设置 CUSTOM:*SUPPRESS-SIMILAR-CONSTANT-REDEFINITION-WARNING* 为一个非NIL的值来抑制这个警告.CUSTOM:*SUPPRESS-SIMILAR-CONSTANT-REDEFINITION-WARNING* 的初始值是 NIL.
5.6 宏 EXT:FCASE
这个宏允许为 CASE 指定测试的值,比如,
(fcase string= (subseq foo 0 (position #\Space foo))("first" 1)(("second" "two") 2)(("true" "yes") t)(otherwise nil))
和以下结构一样
(let ((var (subseq foo 0 (position #\Space foo))))(cond ((string= var "first") 1)((or (string= var "second") (string= var "two")) 2)((or (string= var "true") (string= var "yes")) t)(t nil)))
如果你使用内置的 HASH-TABLE 测试方式 (见 Section 18.4, “Function HASH-TABLE-TEST”) 作为这个测试值 (比如, EQUAL 而不是上述 STRING= , 但不是用 EXT:DEFINE-HASH-TABLE-TEST 定义的测试方式), 编译器就可能会优化这个 EXT:FCASE 结构,优于对应的 COND 结构.
5.7 函数 EXT:XOR
这个函数检查它的参数中是否一个为非NIL, 如果是的话, 以多值返回它的值和在参数列表中的索引否则返回 NIL.
5.8 函数 EQ
EQ 比较 CHARACTER 和 FIXNUM 就像 EQL 所做的. 没有不必要的 CHARACTER 和 NUMBER 的拷贝. 然而, 还是应该使用 EQL 因为它跨 Common Lisp 实现时具有更好的移植性.(LET ((x y)) (EQ x x)) 总是返回 T 对于任何的Lisp对象 y. 也见 Equality of foreign values.
5.9 特殊操作符 FUNCTION
(FUNCTION symbol) 如果由 FLET or LABELS 建立的局部的函数定义存在就返回这个, 否则返回全局函数定义.(SPECIAL-OPERATOR-P symbol) 返回 NIL 或者 T. 如果它返回 T, 那么 (SYMBOL-FUNCTION symbol) 返回这个特殊操作符的处理者 (无用的) .
CLISP 实现记录:5.数据和控制流相关推荐
- innodb一页为什么要存储两行记录_innodb数据记录存储结构
innodb页 数据存储在磁盘上:数据处理的过程发生在内存中,需要把磁盘的数据加载到内存中:处理写入或修改请求时,需要把内存中的内容刷新到磁盘上: innodb存储引擎,不是一条一条从磁盘读取记录,而 ...
- 使用sharepreferce记录数组数据
使用sharepreferce记录数组数据 1 /** 2 * 3 * sharepreference纪录news数据 4 * 5 * 6 */ 7 private static final Stri ...
- 记录mysql数据库存表情
记录mysql数据库存表情 项目需求:类似于淘宝的订单评价页面 扩展:数据存储与传输显示.扣扣表情包 项目需求:类似于淘宝的订单评价页面 期望页面显示出,在编辑信息框中输入的表情 一开始我们数据库表使 ...
- 宝宝成长记录标准数据
宝宝体重和身高标准 今天带宝宝去打预防针,同时也做一下身体健康检查.宝宝刚满二个月,现在体重:6.8kg, 身高:60.4cm,长势不错啊很健康. 下面的表格是宝宝成长记录标准数据表,每次自己好好对一 ...
- 【应急基础】————7、Tomcat日志如何记录POST数据
Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选. 对于常使用web服务器的朋 ...
- 不记录用户数据浏览器
不记录用户数据浏览器 秘迹搜索 searx duckduckgo
- 1588 数字游戏(LOJ10166) 暴力0分 需要记录中间数据的数位DP
总目录 在线测评地址(ybt) 在线测评地址(LOJ) 1.暴力0分 ybt 未通过 测试点 结果 内存 时间 测试点1 答案错误 612KB 2MS LOJ 暴力0分代码如下: #include & ...
- 几种常用的记录总线数据的Log文件以及如何保存和转换
不管你是测试还是开发人员,一定免不了和总线打交道,对于测试工程师,提bug时经常需要上传log文件,其中就涉及到总线数据的保存:对于软件工程师,分析问题时需要用总线数据文件进行回放复现,这些都离不开记 ...
- 谷歌Jeff Dean团队提出利用深度学习对「电子健康记录」数据进行分析,可提高医疗诊断预测的准确性
原文来源:arXiv 作者:Alvin Rajkomar.Eyal Oren.Kai Chen.Andrew M. Dai.Nissan Hajaj.Peter J. Liu.Xiaobing Liu ...
最新文章
- KDD Cup 2021城市大脑赛题解析!报名倒计时3天
- 第六篇:并发-粒度锁
- 从 AlphaGo 到具有人类智慧的 AI 究竟有多远?Keras之父François Chollet告诉你
- 2001年 数的划分
- 设计模式--状态(State)模式
- linux下,MySQL默认的数据文档存储目录为/var/lib/mysql。
- 【网址收藏】dubbo特新概念及特性、环境搭建、dubbo-monitor安装、rpc原理以及dubbo原理:框架设计、启动解析加载配置信息、服务暴露、服务引用及调用
- VTK:Points之ExtractSurfaceDemo
- python经典程序实例-Python3经典100例(③)
- VNC+SSH相关应用
- 数据传输类型与通信方式
- php中fread用法,php fread函数与fread函数用法_PHP教程
- matlab 象限图,【数据可视化】Tableau教程(十)象限图
- wd移动硬盘插电脑没反应_WD MY BOOK 桌面移动硬盘 插电脑不识别的解决办法。
- 探秘BOF 和EOF
- 228句最常用英文口语短句(转)
- 小程序+动易SF制作随手拍实例全景式操作(3)
- 西瓜视频中视频计划还有机会吗?
- 答:本科生写论文对考研有用吗?
- 螺旋矩阵(Java)