HY lisp quote unquote等学习

宏相关语法糖

This is all resolved at the reader level, so the model that gets produced is the same whether you take your code with sugar or without.

Macro

Syntax

quote

'FORM

quasiquote

`FORM

unquote

~FORM

unquote-splice

~@FORM

unpack-iterable

#* FORM

unpack-mapping

#** FORM

 quote 引号,是双引号下面的那个单引号'

quasiquote 反引号,是左上角波浪线下面的那个引号`

unquote 波浪线 取消引用~

unquote-splice 取消引用并展开 波浪线+@ ~@

unpck-iterable 取消引用并迭代 使用#*

unpack-mapping 取消引用并映射 #**

 quote 引号,是双引号下面的那个单引号'

直接引用后面的表达式,不执行,有点像python里的单引号和双引号。hy手册中的描述:

返回给定的模型而不进行评估。或者更为迂腐的是,quote遵循生成并返回最初调用的模型的代码。因此,quote充当了模型构造函数的语法糖

(quote a); Equivalent to:  (hy.models.Symbol "a")
(quote (+ 1 1)); Equivalent to:  (hy.models.Expression [;   (hy.models.Symbol "+");   (hy.models.Integer 1);   (hy.models.Integer 1)])

 可以直接用单引号代替quote

=> 'a
'a
=> '(+ 1 1)
'(+ 1 1)

quasiquote 反引号,是左上角波浪线下面的那个引号`

跟引号类似,只是表达式里面有些符合要求的会被求值。hy手册中说:

准引号与引号类似,只是它将模型视为模板,其中某些特殊表达式表示某些代码应该被求值,并在那里替换其值。这个想法类似于C的sprintf或Python的各种字符串格式构造。

=> (setv x 2)
=> (quasiquote (+ 1 (unquote x)))  ; => '(+ 1 2)
'(+ 1 2)=> `(+ 1 ~x)
'(+ 1 2)

可以看到,表达式里面使用unquote的地方,进行了求值操作。如果使用quote引号,那么里面即使用了unquote,也会原封不动的表达出来

=> '(+ 1 ~x)
'(+ 1 ~x)

 unquote 波浪线~ 取消引用

在 quasiquote 表达式内部使用,用于指示某个部分应该被求值而不是作为字面量。就像前面的例子里,x取消引用,也就是要对x进行求值。记住unquote 波浪线~ 应用在quasiquote反引号表达式内部。也就是有unquote~,表达式前面就应该有quasiquote` 。

看个例子

=> (defmacro set-foo [value]
...   `(setv foo ~value))
=> (set-foo (+ 1 2 3))
=> (print foo)  ; => 6
6

 unquote-splice(取消引用并展开)

也是在quasiquote反引号内部使用,符号是波浪线后跟 @ 符号 ~@ ,与 unquote 类似,但专门用于列表或向量,将其内容展开为多个元素。

=> (setv X [1 2 3])
=> `[a b ~X c d ~@X e f]
'[a b [1 2 3] c d 1 2 3 e f]

第一个 ~X展开为[1 2 3] 第二个 ~@X 展开为1 2 3 ,可见 ~@把列表展开了,也就是去掉了列表的中括号[ ] 

unpck-iterable 取消引用并迭代(迭代解包)

符号:unpack-iterable用#* ,hy手册:

(也称为splat运算符、星形运算符、自变量扩展、自变量爆炸、自变量收集和可变参数等…)
迭代解包和映射解包允许可迭代或映射对象(分别)向函数提供位置或关键字参数。

=> [(unpack-iterable [1 2]) 3 4]
[1 2 3 4]=> [#*[1 2] 3 4]
[1 2 3 4]

提供位置参数

=> (defn f [a b c d] [d c b a])
=> (f 1 2 3 4)
[4 3 2 1]
=> (f #*[1 2 3 4])
[4 3 2 1]

解包在各种上下文中都是允许的,并且可以在一个表达式中解包多次(PEP 3132、PEP 448)。

=>  (setv [a #* b c] [1 2 3 4 5])
=>  [a b c]
[1 [2 3 4] 5]
=> [#* [1 2] #* [3 4]]
[1 2 3 4]

unpack-mapping 取消引用并映射(映射解包)

用于在宏展开时解包映射(如哈希表),符号: unpack-mapping用#** 

=> (defn f [a b c d] [d c b a])
=> (f 1 2  #** {"c" 3 "d" 4})
[4 3 2 1]

当然解包在各种上下文中都是允许的,并且可以在一个表达式中解包多次。 

=> {#** {1 2} #** {3 4}}
{1 2  3 4}
=> (f #* [1] #* [2] #** {"c" 3} #** {"d" 4})
[4 3 2 1]

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

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

相关文章

昇思25天学习打卡营第16天 | DCGAN生成漫画头像

这两天把minspore配置到我的电脑上了,然后运行就没什么问题了✨😊 今天学这个DCGAN生成漫画头像,我超级感兴趣的嘞🦄🥰 GAN基础原理 这部分原理介绍参考GAN图像生成。 DCGAN原理 DCGAN(深度卷积对抗生成…

秒验—手机号码置换接口

功能说明 提交客户端获取到的token、opToken等数据,验证后返回手机号码 服务端务必不要缓存DNS,否则可能影响服务高可用性 调用地址 POST https://identify-verify.dutils.com/auth/auth/sdkClientFreeLogin 请求头 Content-Type :appli…

图书商城系统java项目ssm项目jsp项目java课程设计java毕业设计

文章目录 图书商城系统一、项目演示二、项目介绍三、部分功能截图四、部分代码展示五、底部获取项目源码(9.9¥带走) 图书商城系统 一、项目演示 图书商城系统 二、项目介绍 语言: Java 数据库:MySQL 技术栈:SpringS…

SaaS行业的AI化征程:穿越“大模型焦虑”,拥抱“AI自信”

随着大模型技术的风起云涌,SaaS行业正站在一个充满机遇与挑战的十字路口。本文旨在深入剖析SaaS厂商在AI化升级过程中所遭遇的“大模型焦虑”,并探索通过战略性的AI应用策略,如何重拾信心,实现产品与服务的华丽转身,为…

关于虚拟机上不了网的解决办法

先ping出ip地址 或者查询ifconfig得到目前网络信息 继续输入命令Ifconfig -a查询是否能找到ip地址 明显ens33是没有打开的,所以找不到分配的ip地址,需要打开,自动随机分配ip 输入命令: sudo dhclient ens33 现在就可以开始上网…

公司“领导”们竟如此讨论工作!小伙:此事有蹊跷;|国家漏洞库CNNVD:关于OpenSSH安全漏洞的通报;

公司“领导”们竟如此讨论工作!小伙:此事有蹊跷 “当时我正在等验证码 还好你们快了一步 不然公司的93万余元就没了” 一谈到这件事 杜先生仍然心有余悸 近日 正在处理公司财务工作的杜先生 突然被拉进了一个QQ群聊 从头像、昵称上看 群聊里的竟…

累积分布函数的一些性质证明

性质1: E [ X ] ∫ 0 ∞ ( 1 − F ( x ) ) d x − ∫ − ∞ 0 F ( x ) d x ( 1 ) E[X]\int_0^{\infty}(1-F(x))dx - \int_{-\infty}^0F(x)dx\quad (1) E[X]∫0∞​(1−F(x))dx−∫−∞0​F(x)dx(1) 证明: E [ X ] ∫ − ∞ ∞ x p ( x ) d x E[X] …

SpringBoot | 大新闻项目后端(redis优化登录)

该项目的前篇内容的使用jwt令牌实现登录认证,使用Md5加密实现注册,在上一篇:http://t.csdnimg.cn/vn3rB 该篇主要内容:redis优化登录和ThreadLocal提供线程局部变量,以及该大新闻项目的主要代码。 redis优化登录 其实…

macOS版ChatGPT更新:修复AI对话纯文本存储问题

猫头虎 🐯 建联猫头虎,商务合作,产品评测,产品推广,个人自媒体创作,超级个体,涨粉秘籍,一起探索编程世界的无限可能! macOS版ChatGPT更新:修复AI对话纯文本…

JAVA高级进阶11多线程

第十一天、多线程 线程安全问题 线程安全问题 多线程给我们带来了很大性能上的提升,但是也可能引发线程安全问题 线程安全问题指的是当个多线程同时操作同一个共享资源的时候,可能会出现的操作结果不符预期问题 线程同步方案 认识线程同步 线程同步 线程同步就是让多个线…

内网渗透学习-杀入内网

1、靶机上线cs 我们已经拿到了win7的shell,执行whoami,发现win7是administrator权限,且在域中 执行ipconfig发现了win7存在内网网段192.168.52.0/24 kali开启cs服务端 客户端启动cs 先在cs中创建一个监听器 接着用cs生成后门,记…

Mysql 的第二次作业

一、数据库 1、登陆数据库 2、创建数据库zoo 3、修改数据库zoo字符集为gbk 4、选择当前数据库为zoo 5、查看创建数据库zoo信息 6、删除数据库zoo 1)登陆数据库。 打开命令行,输入登陆用户名和密码。 mysql -uroot -p123456 ​ 2)切换数据库…

利用pg_rman进行备份与恢复操作

文章目录 pg_rman简介一、安装配置pg_rman二、创建表与用户三、备份与恢复 pg_rman简介 pg_rman 是 PostgreSQL 的在线备份和恢复工具。类似oracle 的 rman pg_rman 项目的目标是提供一种与 pg_dump 一样简单的在线备份和 PITR 方法。此外,它还为每个数据库集群维护…

Day05-01-jenkins进阶

Day05-01-jenkins进阶 10. 案例07: 理解 案例06基于ans实现10.1 整体流程10.2 把shell改为Ansible剧本10.3 jk调用ansible全流程10.4 书写剧本 11. Jenkins进阶11.1 jenkins分布式1)概述2)案例08:拆分docker功能3)创建任务并绑定到…

【刷题笔记(编程题)05】另类加法、走方格的方案数、井字棋、密码强度等级

1. 另类加法 给定两个int A和B。编写一个函数返回AB的值,但不得使用或其他算数运算符。 测试样例: 1,2 返回:3 示例 1 输入 输出 思路1: 二进制0101和1101的相加 0 1 0 1 1 1 0 1 其实就是 不带进位的结果1000 和进位产生的1010相加 无进位加…

ssm校园志愿服务信息系统-计算机毕业设计源码97697

摘 要 随着社会的进步和信息技术的发展,越来越多的学校开始重视志愿服务工作,通过组织各种志愿服务活动,让学生更好地了解社会、服务社会。然而,在实际操作中,志愿服务的组织和管理面临着诸多问题,如志愿者…

dledger原理源码分析系列(一)-架构,核心组件和rpc组件

简介 dledger是openmessaging的一个组件, raft算法实现,用于分布式日志,本系列分析dledger如何实现raft概念,以及dledger在rocketmq的应用 本系列使用dledger v0.40 本文分析dledger的架构,核心组件;rpc组…

【pytorch16】MLP反向传播

链式法则回顾 多输出感知机的推导公式回顾 只与w相关的输出节点和输入节点有关 多层多输入感知机 扩展为多层感知机的话,意味着还有一些层(理解为隐藏层σ函数),暂且设置为 x j x_{j} xj​层 对于 x j x_{j} xj​层如果把前面的…

迅捷PDF编辑器合并PDF

迅捷PDF编辑器是一款专业的PDF编辑软件,不仅支持任意添加文本,而且可以任意编辑PDF原有内容,软件上方的工具栏中还有丰富的PDF标注、编辑功能,包括高亮、删除线、下划线这些基础的,还有规则或不规则框选、箭头、便利贴…

【护眼小知识】护眼台灯真的护眼吗?防近视台灯有效果吗?

当前,近视问题在人群中愈发普遍,据2024年的统计数据显示,我国儿童青少年的总体近视率已高达52.7%。并且近视背后潜藏着诸多眼部并发症的风险,例如视网膜脱离、白内障以及开角型青光眼等,严重的情况甚至可能引发失明。为…