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(深度卷积对抗生成…

Python中的lambda函数是什么以及它有哪些用途和限制

Python中的lambda函数 定义 Python中的lambda函数是一种简洁定义小函数的方式,也被称为匿名函数。它允许用户快速定义一个小的、一次性的函数对象,而无需正式地命名一个函数。lambda函数的基本语法为:lambda arguments: expression&#xf…

港三新二是那几所大学?有哪些知名校友?中英双语介绍

中文版 港三新二指的是香港和新加坡的五所著名大学,分别是香港大学(HKU)、香港中文大学(CUHK)、香港科技大学(HKUST)、新加坡国立大学(NUS)和南洋理工大学(N…

秒验—手机号码置换接口

功能说明 提交客户端获取到的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对话纯文本…

HOW - React Router v6.x Feature 实践(react-router-dom)

目录 基本特性ranked routes matchingactive linksNavLinkuseMatch relative links1. 相对路径的使用2. 嵌套路由的增强行为3. 优势和注意事项4. . 和 ..5. 总结 data loadingloading or changing data and redirectpending navigation uiskeleton ui with suspensedata mutati…

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)切换数据库…

菜鸡的原地踏步史(◐‿◑)

leetcode启动!(╯‵□′)╯︵┻━┻ 尝试改掉想到哪写哪的代码坏习惯 链表 相交链表 public class Solution {/**ac(公共长度)b所以 链表A的长度 a c,链表B的长度b ca b c b c a只要指针a从headA开始走,走完再…

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

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

抖音使矛,美团用盾

有市场,就有竞争。抖音全力进军本地生活市场欲取代美团,已不是新闻。 互联网行业进入存量时代,本地生活市场是为数不多存在较大增长空间的赛道。艾媒咨询数据显示,预计2025年在线餐饮外卖市场规模达到17469亿元,生鲜电…

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)创建任务并绑定到…

安装 ClamAV 并进行病毒扫描

安装 ClamAV 并进行病毒扫描 以下是安装 ClamAV 并使用它进行病毒扫描的步骤: 1. 安装 ClamAV 在 Debian/Ubuntu 系统上: sudo apt update sudo apt install clamav clamav-daemon在 RHEL/CentOS 系统上: sudo yum install epel-release…