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.pswp.cn/diannao/41134.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/41134.shtml
英文地址,請注明出處:http://en.pswp.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…