Common Lisp学习之十一:使用宏

Unity 3D 血条进阶实现:5步解决透视、遮挡与相机裁剪问题 本文详细介绍了Unity 3D中血条系统的进阶实现方法,通过5个步骤解决透视、遮挡与相机裁剪等常见问题。内容包括世界空间血条重构、动态透视补偿技术、智能遮挡处理方案、相机裁剪边界保护以及性能优化与批处理,帮助开发者构建适应复杂场景的工业级血条系统。特别适用于开放世界和RPG游戏开发。 阅读详情
1 CL中常见的宏
1.1 条件宏
when   (defmacro when (cond &rest) `(if ,cond (progn ,@rest)))
unless (defmacro unless (cond &rest) `(if (not ,cond) (progn ,@rest)))
cond    
1.2 逻辑宏
and 
or
not
1.3 循环宏
CL中循环宏均是基于tagbody和go来实现的。
dolist   (dolist (var lst) (body))
dotimes   (dotimes (var count) (body))
do        (do (variable*) (end-form return-form) statement*)而变量部分(var init-form step-form)
loop      基本语法为:(loop body*)
          扩展归语法支持across,and,below,collectiong,counting,finally,for,from,summing,then,to等循环关键字。

2 宏展开期与运行期
    当编译lisp代码时,会先将所有的宏展现并生成代码,然后才进行编译。宏运行期称为宏展开期,和运行期是不同的,后者是生成后的代码实际运行的阶段。
    这一点很重要,因为宏展现期的代码与运行期的代码相比,运行环境完全不同,其无法访问那些仅存在于运行期的数据。
    因此,总是向宏传递那些代表宏中sub-form的未求值lisp对象,宏的作用是生成代码,而非直接做任何事情。

3 defmacro
    宏的定义和函数类似,使用defmacro来定义。
    我们使用宏是希望将某种形式转换成代码;因此我们先要定义清楚宏调用的形式,以及宏展开后的形式。清楚这两点后,我们来写代码在这两种形式间转换。

4 宏形参
    传递给宏的实参是代表调用宏时的源代码LISP对象,因此宏的第一步是提取出这些对象中用于展开的部分。

5 生成展开式
    使用`语法来生成代码,它比'更强大,支持,和,@的求值。当读取器讲到一个`表达式时,它将其翻译成生成适当列表结构的代码。如`(,a b)生成(list a 'b)
    在slime中,可以调用C-c ret来显示其宏展开形式。我们自己也可以使用macroexpand-1来展开。

6 堵住漏洞
    宏可能以三种形式泄露其内部细节。第一种是重复计算;第二种是由于表达式的副作用,造成因求值顺序不同而结果出错;第三种是内部变量名覆盖外部变量。
    这三个问题都比较容易解决。第一个问题,注意对于表达式只初始化一次;第二个问题是保证初始你给的顺序。第三个问题要使用gensym来生成唯一变量名。
学习 Lisp 语言的相关书籍 Lisp语言难以推广的原因有很多,而相对来说,比较高额的学习成本便是这众多原因的其中之一 ...... 阅读详情

相关推荐

Common Lisp 学习书目

书籍 1、《Common Lisp: A Gentle Introduction to Symbolic Computation》 English Version:http://www.cs.cmu.edu/~dst/LispBook/ 中文版:无 适用于无编程基础人士 2、《Common Lisp the Language, 2nd Edition》 English Vers

u011050969的专栏 1748

LISP宏的几点理解

lisp宏的理解

Dean Chen的专栏 8192

Common Lisp语法——标准控制宏

WHEN和UNLESS 先来了解下IF表达式: (if condition then-form [else-form]) 其行为就是:当condition为non-NIL时则运行then-form并返回其值,否则运行else-form并返回其值。 (if (> 2 3) "yes" "no") -> "no" (if (> 2 3) "yes") -> NIL (if

DreamPixel的专栏 1476

由浅入深学习 Lisp 宏之理论篇

宏(macro)是 Lisp 语言中最重要的武器,它可以自动生成运行时的代码。宏也是编写领域特定语言(DSL)的利器,可以在不改动语言本身的基础上,增加新的程序构造体,这在其他语言中是不可能。比如,现在比较流行的同步方式写异步代码的 async/await,在非 Lisp 语言需要语言本身支持,但是在 Lisp 里面可以通过几个宏来解决,...

weixin_34315189的博客 478

【简单介绍Lisp的学习历程】

🌊Lisp 是一种历史悠久的编程语言,由约翰·麦卡锡(John McCarthy)在 1958 年开发,以其前瞻性的功能在计算机科学界走向传奇。Lisp 语言家族包含了多种方言,其中最著名的包括 Common Lisp 和 Scheme。

2301_81357485的博客 1374

【简单介绍下Lisp的学习历程】

🌊Lisp 是一种历史悠久的编程语言,由约翰·麦卡锡(John McCarthy)在 1958 年开发,以其前瞻性的功能在计算机科学界走向传奇。Lisp 语言家族包含了多种方言,其中最著名的包括 Common Lisp 和 Scheme。

cz88888888666的博客 1818

lisp宏介绍

Lisp笔记(一些简单宏介绍.初级介绍) 一些简单的宏。 一: 1)IF (if condition then-form [else-form]) (if (> 2 3) “Yup” “Nope”) -> Nope PROGN可以按顺序执行任意数量的形式 (if (sam-p current-message) (progn (file-in-spam-folder current

看我看我的专栏 2764

《Let Over Lambda》免费PDF:深入Common Lisp宏与闭包

在 Common Lisp 中,宏与闭包是两个极易被低估的核心机制。闭包通过让函数捕获外部变量形成持久环境,而宏本质上是接收源码、返回源码的代码生成函数,二者结合能帮助开发者定义新语法、实现领域专用语言,并消除重复模板代码。对于已有基础语法能力、希望深入代码生成与 DSL 设计的工程师,掌握宏展开原理是进阶的关键。《Let Over Lambda》正是这样一部聚焦宏编程的经典著作,作者 Doug Hoyte 在官网免费公开了完整 PDF,无需注册即可阅读。书中从 let 与 lambda 构造闭包讲起,逐步

weixin_33829657的博客 491

宏编程:C++宏、Rust宏和Lisp宏比较

虽然 C++ 模板有时被描述为宏编程(或元编程),但它们处理的用例与 Lisp 或 Rust 宏处理的用例有很大不同,并且在更受限制的计算和语法范围内进行。综上所述,Lisp的宏系统在功能和易用性方面通常更具优势,C++和Rust的宏系统在特定场景下也各有独特的优势和应用。Rust宏在功能上更强大,提供了声明式和过程宏,但需要更深的语言和编译过程理解,增加了编写和使用的复杂性。Lisp宏由于其同像性,允许直接操作代码作为数据,宏的创建和使用最为简单和强大,整体设计更为灵活。代码更容易阅读和维护。

极道Jdon的技术博客 866

Common Lisp学习资源:练习与解决方案大全

本文还有配套的精品资源,点击获取 简介:Common Lisp是一种历史悠久且应用广泛的编程语言,以其独特的语法、灵活性和强大的宏系统而知名。这个项目“learninglisp”提供了丰富的练习和解决方案,帮助学习者逐步掌握Lisp编程。项目内容包括S表达式的使用,符号计算的能力,以及一系列教程、练习题目、解决方案、测试脚本、代码片段和阅读材料。通过这些资源,学习者可以深入...

weixin_36369848的博客 1364

光栅衍射有入射角时_衍射型多焦点人工晶体光学原理

多焦点人工晶体如何把光线分成多个焦点的?这个问题大部分专业书只是蜻蜓点水,并没有讲明白。希此文粗浅的解释,能帮您加深理解,请多指正。接下来,我将按照一下历史发展的顺序讲解一下:光的认识、菲涅尔灯塔(菲涅尔透镜)、菲涅尔波带盘(半波带盘)、多焦点人工晶体。一:首先复习一下光的认识历史。我们现在都知道光是一种电磁波,具有波粒二相性,但是认识光的本质也经历非常曲折漫长的过程。牛顿时代的几何光...

weixin_28963467的博客 2351

Common Lisp Loop 宏实例

Common Lisp Loop 宏教程 Loop 宏是Common lisp操作符中最有价值和文档最少的操作符之一。它的价值体现在它比lisp的其他构造,例如maping 操作符和递归操作符,更加强大,紧凑和具有更强的可读性。并且对于那些用传统语言工作的程序员来说,Loop宏使用的编程方式会更容易理解。这个教程将提供给你如何使用Loop宏的例子。 Loop宏和其他大多数的Lisp表达式不

JonnyWei的专栏 1万+

告别抓包失败!保姆级配置:让Burp+Proxifier稳定抓取任意微信小程序

本文提供了一套完整的Burp+Proxifier配置方案,确保稳定抓取微信小程序数据。从环境准备、工具选型到Burp Suite深度配置和Proxifier精准设置,详细解决了证书安装、进程捕获和乱码解析等核心问题,帮助开发者告别抓包失败,提升调试效率。

weixin_28738165的博客 452

告诉你真实的Common.Lisp的宏

Common Lisp总共有4种被称为“宏”(macro)的东西。下面分别说说他们的作用(这里仅仅只说编译的事情,而且还很模糊没说是哪种编译器(一个Common Lisp实现必须要实现至少两个不同的编译器,分别对应不同的语义))。 总之,为了不把Common Lisp的复杂给显露出来吓跑人,先将就吧。 macro 编译器在遇到一个

Just have fun 2759

DRAM知识整理系列(三):部分时序参数整理

一、tCL-tRCD-tRP-tRAS(第一时序) 内存是根据行和列寻址的,当请求触发后,最初是tRAS(Active to precharge Delay),预充电后,内存才真正开始初始化RAS(Row Address Strobe)。一旦tRAS激活后,RAS开始进行需要数据的寻址。首先是行地址,然后初始化tRCD(RAS to CAS Delay),周期结束,接着通过CAS(Column Address Strobe)访问所需数据的十六进制地址。其中,从CAS开始到CAS结束,就是CAS延迟(即t

不吃鱼的猫的博客 7万+

图形学基础|球谐光照(Spherical Harmonics Lighting)

球谐光照(Spherical Harmonics Lighting) 文章目录球谐光照(Spherical Harmonics Lighting)一、前言二、球谐函数2.1 基函数2.2 投影与重建2.3 应用三、漫反射环境光3.1 IrradianceMap3.2 数学推导3.3 实践参考博文 一、前言 在学习图形渲染的过程中,一直對球谐函数(球谐光照)有一点了解,但没有亲手实现过。 关于球谐函数的数学概念是比较复杂的,笔者也实在无法完全理解,这篇文章只能从做东西的角度来说,公式是如何和代码进行对应的。

【黑键】 1万+

探索Common Lisp学习宝库:Awesome Common Lisp Learning

探索Common Lisp学习宝库:Awesome Common Lisp Learning 项目介绍 欢迎来到Awesome Common Lisp Learning,这是一个专注于Common Lisp学习资源的精选列表。无论你是初学者还是经验丰富的Lisp程序员,这里都有丰富的资料帮助你深化对这一强大编程语言的理解。项目不仅提供了从基础到高级的学习路径,还包括了各种环境设置、在线参考、书籍推...

gitblog_00450的博客 418

掌控板玩板指南1:初识掌控板、扩展板、Mind+编辑器

掌控板、I/O扩展板入门

好乐无荒之地 1万+

如何通过Lisp Koans快速掌握Common Lisp:终极学习指南

Common Lisp Koans是一个语言学习练习项目,它以有序的单元测试组形式,引导学习者逐步掌握Common Lisp的众多语言特性。本文将详细介绍如何利用这个项目高效学习Common Lisp,从环境搭建到进阶练习,让你快速踏上Lisp编程之旅。 ## 什么是Lisp Koans? Lisp Koans是一种基于测试驱动的学习方法,类似于Ruby Koans和Python Koans。

gitblog_00693的博客 913

用 ABAP RAP + XCO 把 Excel 导入业务对象:从弹窗 Action 到 EML 落库与附件清理的完整实践

摘要:本文介绍了在SAP RAP框架下实现Excel批量导入功能的完整方案。通过XCO库的XLSX模块解析Excel文件,结合RAP的行为定义和Fiori Elements界面集成,构建了一个支持试运行、数据校验和自动合并的业务导入功能。方案采用RAP标准范式,包括Action参数设计、EML事务处理、附件管理以及异常消息反馈,实现了从文件上传到数据落库的端到端流程,既保证了系统稳定性,又提升了业务用户体验。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 270

PyTorch实战(30)——使用TorchScript和ONNX导出通用PyTorch模型

在本节中,我们将深入探讨使用 TorchScript 导出 PyTorch 模型。通过序列化,TorchScript 使模型与 Python 生态系统独立,从而使得模型可以在其他环境中加载,例如基于 C++ 的环境。我们还跨越 Torch 框架与 Python 生态的边界,研究机器学习通用开放格式 ONNX,该技术能帮助我们将 PyTorch 训练的模型导出至非 PyTorch 甚至非 Python 环境。

盼小辉丶的博客 3493

Common Lisp

 Common Lisp 来自 维客 Jump to: navigation, search Common Lisp,一般缩写为 CL(不要和缩写同为CL的組合邏輯混淆),是Lisp的方言,标准由ANSI X3.226-1994定义。它是为了标准化此前众多的Lisp分支而开发的,它本身并不是一个具体的实现而是各个Li

skyremember的专栏 3367

1、JMP脚本编程全面指南:从基础到高级应用

本博客全面介绍了JMP脚本编程的各个方面,从JMP基础和JSL入门,到数据类型、数据结构、编程方法、数据表操作、图形与三维场景脚本,再到应用程序创建与扩展功能。内容涵盖脚本工具使用、常见任务实现、兼容性说明及未来发展趋势,旨在帮助用户掌握JMP脚本语言的强大功能,提升数据分析的自动化与定制化能力。适合从初学者到高级用户的深入学习与实践参考。

flink9streamer的博客 266

Common Lisp 编程语言深度解析

CommonLisp是Lisp家族的主要方言,作为世界上第二古老的高级编程语言,以其强大的功能和灵活性著称。它采用S-表达式和"代码即数据"的哲学,支持REPL驱动的交互式开发,并拥有独特的宏系统,可实现元编程和语言扩展。CommonLisp融合了函数式、面向对象(通过CLOS)等多种编程范式,提供高性能和动态类型检查,适合人工智能、符号计算和复杂系统开发。尽管学习曲线陡峭,但其卓越的表达力和生产力使其在特定领域保持独特价值。

bulita great world 1422

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

JSCL:将Common Lisp编译为JavaScript的强大工具

JSCL(JavaScript Common Lisp)是一个将Common Lisp代码编译为JavaScript的编译器。它不仅支持在浏览器中运行,还可以通过Node.js在服务器端执行。JSCL的核心优势在于其能够将Lisp的强大功能与JavaScript的广泛应用场景相结合,为开发者提供了一种全新的编程体验。 ## 项目技术分析 JSCL的核心技术在于其编译器的设计。它通过自举(boo...

gitblog_00388的博客 915

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

JSCL:Common Lisp 到 JavaScript 编译器使用教程

JSCL 是一个从 Common Lisp 到 JavaScript 的编译器,它通过 Common Lisp 自举实现,并且可以在浏览器中执行。JSCL 的目标是提供一个 Common Lisp 的子集,使其能够在 JavaScript 环境中运行。 ## 2、项目快速启动 ### 安装 JSCL 你可以通过 npm 安装 JSCL: ```bash npm install -g jsc...

gitblog_01112的博客 1113

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

上一篇: Common Lisp学习之十:输出格式化控制与高级循环控制
下一篇: Squid代理服务3.1版本的配置和使用简介
zzulp
博客等级 码龄19年 464粉丝 176原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值