HY Lisp 读取宏(reader macro)学习

在学习HY lisp语言的时候HY编程快速入门实践课第三章 HY宏入门-CSDN博客,学习到了读取宏(reader macro),尝试将其概念弄明白。

首先,读取宏是Lisp语言中都有的一种概念,所以可以通过任意一种Lisp语言的文档来学习。因为HY的文档比较简单(篇幅少),所以准备结合Common Lisp、On Lisp等来进行学习。

在 Lisp 表达式的一生中,有三个最重要的时刻,分别是读取期(read-time),编译期(compile-time) 和运行期(runtime)。运行期由函数左右。宏给了我们在编译期对程序做转换的机会。而读取宏(read-macro),它们在读取期发挥作用。本段文字来源:第 17 章 读取宏(read-macro)_w3cschool

读到这里,终于明白了它为什么叫读取宏,原来是在读取时起作用的啊!

这样看来,读取宏就有点类似于宏定义(宏替换)了,比如单引号'就是quote,(quote a) 可以简写成'a 。Lisp里的普通宏也可以完成类似的工作,我们熟知的C语言里的宏定义,也是做了类似的工作。

那么为什么还要单独定义一个叫读取宏的概念呢? 这正是Lisp的的强大而独特之处:读取宏是可以嵌套的。比如(quote (quote a)) 可以简写成''a ,用普通宏实现宏替换,在嵌套的时候可能就会出错,而无法稳定实现功能。同样的C语言的宏定义也无法实现自己对自己的嵌套。

当然HY里对读取宏的实现没有像其它Lisp那么完全,比如它不能实现任意字符定义,而是需要像C的宏定义那样,以#开头。例子:

(defreader do-twice(setv x (.parse-one-form &reader))`(do ~x ~x))#do-twice (print "This line prints twice.")

然后就会看到print语句执行了两次:

=> #do-twice (print "This line prints twice.")
This line prints twice.
This line prints twice.
 

结合前面讲到的,Lisp在读取期(read-time),编译期(compile-time) 和运行期(runtime)三个时期都可以实现循环和嵌套,这极大的增强了Lisp的自由度,可以说Lisp是能力最强大的语言,这样或许不太准确,因为只要是图灵完备的语言,基本都能完成所有的任务,应该说Lisp是最接近人类思维的一种语言。我们想像一下,不管我们是读一个计划书,制定一个计划书,执行一个计划书的时候,是不是都可以重复(嵌套)我们的行为? 比如反复读,反复写,反复实践? 任何一个步骤如果有问题,都可以定位到该问题并反复执行? 

计算机最强大的地方就是快速重复工作,Lisp语言最强大的地方就是在任何时候,不管是读取、编译还是运行期,让计算机快速重复工作!

Lisp语言是最接近接近人类思维方式的一种语言,但是它的缺点也很明显,那就是它的代码是反人类思维,是最难读懂的一种语言。Basic语言(最开始的basic语言),能读懂英文的人,就大致能读懂程序。到了C语言和Pascal,不熟悉该语言语法的人,就有点难读懂,但结合注释,大致知道这一段代码是干什么的。而Lisp的代码,没学过的几乎肯定看不懂。我不知道Lisp高手过一段时间是否还能看懂自己写的代码,因为我还没到高手那个段位。我目前是连手册里的例子代码看起来都磕磕绊绊..... 

没有比较就没有伤害, 读完Lisp代码再看其它语言,不管是C还是汇编,都感觉清新可爱了呢,这也算是附加回报吧。

附录:

代码学习

(defreader matrix(.slurp-space &reader)(setv start (.getc &reader))(assert (= start "["))(.slurp-space &reader)(setv out [[]])(while (not (.peek-and-getc &reader "]"))(cond(any (gfor  c " \t"  (.peek-and-getc &reader c)))None(.peek-and-getc &reader "\n")(.append out [])True(.append (get out -1) (.parse-one-form &reader))))(lfor  line out  :if line  line))

这段代码是一个自定义的读取器(reader)函数,设计用于从一个输入源(如文件或字符串)中解析出嵌套列表(列表的列表)的结构。它采用了类似Scheme或Clojure中读取宏(reader macros)的语法和逻辑,但使用了Python风格的语法和假设的一些函数(如.slurp-space.getc.peek-and-getc.append.parse-one-form等),这些函数在标准的Python中并不直接存在,但可以理解为是某个自定义的读取器环境(可能是基于某种解析库或自定义实现的)提供的接口。下面是对这段代码的详细解析:

  1. 函数定义defreader matrix 定义了一个名为matrix的读取器函数。

  2. 跳过空白.slurp-space &reader 调用可能是为了跳过输入流(&reader)中的任何空白字符(如空格、制表符等),准备开始读取实际的列表内容。

  3. 读取起始符setv start (.getc &reader) 读取一个字符作为开始,并通过assert (= start "[")确认这个字符是左方括号[,表示一个列表的开始。

  4. 再次跳过空白:再次调用.slurp-space &reader以跳过可能的空白字符。

  5. 初始化输出列表setv out [[]] 初始化一个包含空列表的列表,用于存储解析出的嵌套列表。

  6. 循环读取内容:通过一个while循环,持续读取输入直到遇到结束符]。循环体内使用cond结构(类似于Lisp的cond或Python的if-elif-else)来处理不同的读取情况:

    • 如果读取到的字符是空白字符(通过gfor循环和any函数检查),则忽略该字符(None操作)。
    • 如果读取到换行符\n,则在out列表中添加一个新的空列表,以表示新的一行或新的子列表的开始。
    • 如果上述条件都不满足,则调用.parse-one-form &reader来解析当前位置的“一个表单”(可能是一个数字、字符串、列表等),并将其添加到当前子列表中。
  7. 返回结果:最后,通过一个lfor循环(可能类似于列表推导或for循环,但专门用于列表)遍历out列表,并只返回那些非空的子列表(通过:if line条件)。这一步可能是为了过滤掉由于换行符而额外添加的空列表。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/865147.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

免费可视化工具如何提升智慧物流管理效率

在现代智慧物流中,免费可视化工具正扮演着越来越重要的角色。这些工具通过数据的可视化展示,使物流管理更加高效、透明和智能化。免费可视化工具可以将复杂的物流数据转换为直观的图表和图形,帮助管理者实时监控和分析物流运作情况&#xff0…

九浅一深Jemalloc5.3.0 -- ⑥浅*boot

目前市面上有不少分析Jemalloc老版本的博文,但最新版本5.3.0却少之又少。而且5.3.0的架构与5之前的版本有较大不同,本着“与时俱进”、“由浅入深”的宗旨,我将逐步分析最新release版本Jemalloc5.3.0的实现。 另外,单讲实现代码是…

第二证券:可转债基础知识?想玩可转债一定要搞懂的交易规则!

可转债,全称是“可转化公司债券”,是上市公司为了融资,向社会公众所发行的一种债券,具有股票和债券的双重特点,投资者可以选择按照发行时约定的价格将债券转化成公司一般股票,也可作为债券持有到期后收取本…

Load Tensor to local Nvidia GPU

0. 安装Nvidia驱动 ubuntu24.04的安装非常简单,在安装界面,选择为"图形化和其他硬件安装驱动",重启后即有原版Nvidia驱动(如图Nvidia X xxx) 1.确定电脑上是否有NvidiaGPU且安装好Nvidia驱动 import torch print(torch.version…

机器学习 C++ 的opencv实现SVM图像二分类的训练 (二)【附源码】

本节讲机器学习 C 的opencv实现SVM图像二分类的训练&#xff0c;下节讲测试&#xff1a; 数据集合data内容如下&#xff1a; 下载地址为&#xff1a;https://download.csdn.net/download/hgaohr1021/89506900 #include <stdio.h> #include <time.h> #include…

【Python机器学习系列】建立决策树模型预测小麦品种(案例+源码)

这是我的第314篇原创文章。 一、引言 对于表格数据&#xff0c;一套完整的机器学习建模流程如下&#xff1a; 针对不同的数据集&#xff0c;有些步骤不适用&#xff0c;其中橘红色框为必要步骤&#xff0c;欢迎大家关注翻看我之前的一些相关文章。前面我介绍了机器学习模型的二…

开源模型应用落地-FastAPI-助力模型交互-WebSocket篇(六)

一、前言 使用 FastAPI 可以帮助我们更简单高效地部署 AI 交互业务。FastAPI 提供了快速构建 API 的能力,开发者可以轻松地定义模型需要的输入和输出格式,并编写好相应的业务逻辑。 FastAPI 的异步高性能架构,可以有效支持大量并发的预测请求,为用户提供流畅的交互体验。此外,F…

美术馆预约小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;展品信息管理&#xff0c;管理员管理&#xff0c;用户管理&#xff0c;美术馆管理&#xff0c;基础数据管理&#xff0c;论坛管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;美术馆&#xff…

[C/C++] -- gdb调试与coredump

1.gdb调试 GDB&#xff08;GNU 调试器&#xff09;是一个强大的工具&#xff0c;用于调试程序。 安装 1. wget http://ftp.gnu.org/gnu/gdb/gdb-8.1.tar.gz 2. tar -zxvf gdb-8.1.1.tar.gz 3. cd gdb-8.1.1 4. ./configure 5. make 6. make install 基础用法 …

vue3.0(十六)axios详解以及完整封装方法

文章目录 axios简介1. promise2. axios特性3. 安装4. 请求方法5. 请求方法别名6. 浏览器支持情况7. 并发请求 Axios的config的配置信息1.浏览器控制台相关的请求信息&#xff1a;2.配置方法3.默认配置4.配置的优先级5.axios请求响应结果 Axios的拦截器1.请求拦截2.响应拦截3.移…

回流焊常见缺陷

不润湿(Nonwetting)/润湿不良(Poor Wetting) 通常润湿不良是指焊点焊锡合金没有很好的铺展开来,从而无法得到良好的焊点并直接影响到焊点的可靠性。 产生原因: 1. 焊盘或引脚表面的镀层被氧化,氧化层的存在阻挡了焊锡与镀层之间的接触; 2. 镀层厚度不够或是加工不良,很…

常见测试测量接口的比较:PXI、PXIe、PCI、VXI、GPIB、USB

详细比较了六种常见的测试测量接口&#xff1a;PXI、PXIe、PCI、VXI、GPIB、USB。每种接口都有其独特的特点和应用场景。通过比较它们的性能、带宽、模块化程度和应用领域&#xff0c;帮助工程师选择最适合其测试需求的接口类型。 1. PXI&#xff08;PCI eXtensions for Instru…

uboot 编译时传递参数实现条件编译

KCFLAGS make ARCHarm KCFLAGS-DENV_DEBUG CROSS_COMPILEaarch64-linux-gnu-env/sf.c env_sf_save 加入调试信息 # saveenv Saving Environment to SPI Flash... env_sf_save (1) spi_flash_erase (2) spi_flash_write is40000 Erasing SPI flash...Writing to SPI flash.…

试用笔记之-Delphi xe 微信/支付宝支付源代码

首先delphi xe 微信/支付宝支付源代码下载&#xff1a; http://www.htsoft.com.cn/download/DelphiXEWeiXin_ZhiFuBao_ZhiFu.rar 解压后可以看到源代码 直接执行可执行文件&#xff1a;

大模型技术在辅助学习中的应用

大模型技术在辅助学习中的应用场景非常广泛&#xff0c;以下是一些典型示例。大模型技术在辅助学习中具有广阔的应用前景&#xff0c;可以为学生提供更加个性化、智能化和高效的学习体验。随着大模型技术的不断发展&#xff0c;我们可以期待在未来看到更多创新应用。北京木奇移…

【Python】已解决:ERROR: No matching distribution found for JPype1

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决&#xff1a;ERROR: No matching distribution found for JPype1 一、分析问题背景 在安装Python的第三方库时&#xff0c;有时会遇到“ERROR: No matching distribution fo…

前端技术(说明篇)

Introduction ##编写内容&#xff1a;1.前端概念梳理 2.前端技术种类 3.前端学习方式 ##编写人&#xff1a;贾雯爽 ##最后更新时间&#xff1a;2024/07/01 Overview 最近在广州粤嵌进行实习&#xff0c;项目名称是”基于Node实现多人聊天室“&#xff0c;主要内容是对前端界…

springboot图书馆座位预约系统-计算机毕业设计源码85670

目 录 摘要 1 绪论 1.1 选题背景与意义 1.2开发现状 1.3论文结构与章节安排 2 开发环境及相关技术介绍 2.1 MySQL数据库 2.2 Tomcat服务器 2.3 Java语言 2.4 SpringBoot框架介绍 3 图书馆座位预约系统系统分析 3.1 可行性分析 3.1.1 技术可行性分析 3.1.2 经济可…

【Qt】初识QtQt Creator

一.简述Qt 1.什么是Qt Qt 是⼀个 跨平台的 C 图形⽤⼾界⾯应⽤程序框架 。它为应⽤程序开发者提供了建⽴艺术级图形界⾯所需的所有功能。它是完全⾯向对象的&#xff0c;很容易扩展。Qt 为开发者提供了⼀种基于组件的开发模式&#xff0c;开发者可以通过简单的拖拽和组合来实现…