当前位置: 首页 > news >正文

lisp 表达式求值规则

lisp 表达式求值规则
一个要求值的 lisp 对象被称为lisp表达式(form)。
lisp 表达式分三种
    1. 自求值表达式。前面说过数字、字符串、向量都是自求值表达式。还有两个特殊的符号 t 和 nil 也可以看成是自求值表达式。
    2. 符号表达式。符号的求值结果就是符号的值。如果它没有值,就会出现 void-variable 的错误。
    3. 列表表达式。关键看第一个元素
        列表的第一个表达式如果是一个符号,解释器会查找这个符号的函数值。如果函数值是另一个符号,则会继续查找这个符号的函数值。
       这称为“symbol function indirection”。符号功能追踪
       最后直到某个符号的函数值是:
           1. lisp 函数(lambda 表达式)、byte-code 函数、原子函数( primitive function).
              这是正常的函数调用(function call),求值规则如下:
              先对列表中其它元素求值,求值的结果作为函数调用的真正参数。
              然后使用 apply 函数用这些参数调用函数。
              可以理解为把参数和变量绑定到函数后,对函数体顺序求值,返回最后一个 form 的值。

           2. 宏、
              将宏展开。如果扩展后还是一个宏调用,则会继续扩展下去,直到扩展的结果不再是一个宏调用为止。

           3. 特殊表达式或 autoload 对象。
              这些特殊表达式通常是用于控制结构或者变量绑定。例如IF语句,WHEN 语句等
       每个特殊表达式都有对应的求值规则
    
    4. 以上类型都不是,
    比如某个符号的函数值是前面出现的某个符号导致无限循环,
    或者某个符号函数值为空,
    都会导致一个错误 eval: Symbol’s function definition is void: ...


最后用这个elisp 伪代码来说明一下 elisp 中的求值规则:
(defun eval (exp)
  (cond
   ((numberp exp) exp)
   ((stringp exp) exp)
   ((arrayp exp) exp)
   ((symbolp exp) (symbol-value exp))
   ((special-form-p (car exp))
    (eval-special-form exp))
   ((fboundp (car exp))
    (apply (car exp) (cdr exp)))
   (t
    (error "eval: Symbol's function definition is void: %S" exp))))

参考1: elisp 手册
参考2: 网上资料

http://www.lryc.cn/news/19304.html

相关文章:

  • Sophos Firewall OS (SFOS) 19.5 MR1 - 同步下一代防火墙
  • 为什么很多人转行IT考虑后端开发Java?
  • WebDAV之π-Disk派盘+Cloud Player
  • Python-datetime、time包常用功能汇总
  • Spring MVC 源码- HandlerAdapter 组件(四)之 HandlerMethodReturnValueHandler
  • 2023面试必备:web自动化测试POM设计模式详解
  • 【人工智能 AI】Robotic Process Automation (RPA) 机器人流程自动化 (RPA)
  • ubuntu/linux系统知识(37)systemd管理临时文件的方法systemd-tmpfiles
  • 云计算专业和计算机专业哪个好就业?
  • electron sha512 checksum mismatch
  • 使用Chemistry Development Kit (CDK) 来进行化学SMILES子结构匹配
  • CMake模块的使用和自定义模块
  • jvm调优参数配置
  • Leetcode.1567 乘积为正数的最长子数组长度
  • 部分库与使用方法总结(自用)
  • C++实现日期类
  • 想成为一名专业黑客,但不知道从哪里学起?我来教你。
  • VMware ESXi 7.0 U3k Unlocker OEM BIOS 集成网卡驱动和 NVMe 驱动 (集成驱动版)
  • 新的计算方法:预测益生菌在不同生长条件下的相互作用
  • python自学之《21天学通Python》(13)——第16章 数据库编程
  • [架构之路-118]-《软考-系统架构设计师》-软架构设计-11-可靠性相关设计
  • 电阻串联的作用
  • leetcode 1675. Minimize Deviation in Array(最小化数组偏差)
  • 特征向量中心度(eigenvector centrality)算法原理与源码解析
  • Vue3 中组件的使用(上)
  • spring-boot、spring-cloud、spring-cloud-alibaba版本对应
  • 【沐风老师】3DMAX一键楼梯脚本插件StairGenerator使用教程
  • OpenShift 简介
  • netty自定义封包实现
  • ORA error集锦