Common Lisp学习之十:输出格式化控制与高级循环控制

lisp代码-format t 输出语句 立即下载
1 format
1.1 Format函数
其通用调用方式为:(format stream control-string format-args)
第一个参数用于输出目的地,它可以是T NIL 一个流或一个带有填充指针的字符串。T是stdout的简称;NIL将使format返回一个字符串。其他情况均返回NIL。
第二个参数为控制字符串,用来指示如何进行显示,包含众多的格式化指令。第二节将重点介绍这些指令的作用。
第三个参数为需要被输出的格式化参数

1.2 Format指令
所有指令都以波浪线开始并终止于单个字符,例如~A。字符可以是大写或小写。

某些指令带有前置参数,其紧跟在~后,用来控制对指令的进一步细分。多个前置参数用','分隔。这些前置参数可以是十进制数字,也可以是字符。

前置参数对应的值有两种获取方式:前置参数v导致format使用一个格式化参数并将其值用作前置参数,前置参数#将被求值为格式化参数的个数。如果要指定一个前置参数,但不指定其前面的那个,那么必须为每个未指定的参数加上一个逗号。例如~F的两个前置参数N,M分别用于指定整数和小数部分占位。可以省略掉N,但,必须保留。

基本上参数都可以使用:或@修饰符,它们可以对指令进行细微的调整。

1.2.1 通用格式化

~% 用于输出一个换行符,接受前置参数指定换行个数
~& 只有当位于行为非行首时才输出换行符,也支持输出多个换行
~~ 用来输出~,可以控制输出个数

通用格式化指令为~A,它支持任何类型的格式化参数。类似的~S,也支持任何类型的参数,但用于输出可被read读回的形式。对于这两个指令,使用":"修饰,可将NIL输出成()

1.2.2 字符与整数指令

~C 输出单个字符,无前置参数 ":"修饰可将不可打印字符按名字输出,"@"修饰可按字面值输出
~D 以十进制输出整数,":"修饰可间隔三位输出",","@"修饰可打印正负号,两个修饰符可同时使用;支持两个前置参数,第一个指定输出的最小宽度,第二个指定占位符的类型,默认为空格。在":"修饰时支持另两个前置参数,第3个指定数位组的分隔符,第4个指定每组中数位的数量。
~X 以十六进制输出,其他参数与D相同
~O 以八进制输出
~B 以二进制输出
~NR 以N进制输出

1.2.3 浮点指令

~F 以十进制输出小数,第二个前置参数指定小数部分的输出位数
~E 使用科学计数法来输出,第二个前置参数指定小数部分的输出位数
~$ 用于输出货币单位 

1.2.4 英语指令

~R 把数字输出为英文表示的基数,":"修饰表示为序数,"@"修饰表示为罗马数字

~P 如果格式参数不为1,则输出一个参数,可以用来制造复数;":"修饰支持重用格式参数并表示为基数。如(format nil "I have ~R file~:P" 5) => "I have five files"。和"@"同时使用,将输出y或ies。

~( ~) 用于控制输出文本中的大小写,标记之间的部分转化为小写。“@”修饰支持首字母大写,":"修饰支持包有首字符大写,二者同时使用将所有字符变为大写。


1.2.5 条件格式化

~[ ~A ~; ~A~:; ~]  在~[和~]之间的选项可以根据格式参数提供的[0 n-1]位置索引进行选择输出。选项间以~;进行分隔。如果最后一个选项以~:;结束,表示其作为默认子句提供。

使用":"修饰,则变成二先一,在格式参数为假时处理第1个选项,其他处理第2个选项。
使用"@"修饰,

1.2.6 迭代
~{ ~} f支持对参数提供的列表进行迭代处理,直到数据结束。例如(format t "~{~d ~}" (list 1 2 3)) =>"1 2 3 "。为了更好的处理结尾元素,~^指令可在列表无元素时令迭代立即终止。只输出参数,但不执行参数后面指定的格式化。

1.2.7 参数跳转
~* 跳过一个参数,不进行输出处理,":"修饰则可以向前跳,使得一个参数可以使用多次。
可以为~*指定一个前置参数,指定跳的个数。


3 Loop高级用法
Loop提供了用来编写迭代构造的专用语言。其基本结构是一个子句集合,其中每个子句都以一个循环关键字开始。每个子句被Loop宏解析方式取决于具体的关键字。

3.1 For/as关键字
For子句用于在下级子句中对各种对象进行迭代:数字范围、列表、向量、HASH表、包中符号。循环可以包含多个for子句,每个子句都可以命名自己的循环变量。此时任何一个子句达到结束条件循环都会终止。
(loop 
    for item in list
    for i from 1 to 10
    do (something))

3.1.1 计数循环
算术计数循环由for后跟下列介词短语中的1-3个构成: [init] [end] [step]
起始短语指定子句的变量初始值,由介词from/downfrom/upfrom之一后接一个初值数字形式构成。
终止短语指定循环的终止点,由介词to/upto/below/downto/above之一后接终值的形式所构成。
步长短语由介词by form构成,form必须求值为正数。

对于递增时,初值默认为0,递减时必须手工指定初值。另外LOOP宏运行在编译期,必须完全基于介词而不形式的值一决定步进的方向。

如果只是希望循环重复特定次数,使用repeat num

3.1.2 循环集合和包

对list进行迭代的形式
(loop for var in list-form by func=cdr ..)

by用来指定向列表向下移动的函数,in可以用on代替,此时迭代在构成列表的点对单元上步进。

对字符串和向量迭代的形式
(loop for var across "str" .. )

对HASH进行迭代的形式
(loop for var being the hash-keys/hash-values in ht ..);;为了同时可以访问k,v在尾部支持using子句。
(loop for var being the hash-keys in ht using (hash-value v) ...)
(loop for var being the hash-values in ht using (hash-key k) ...)

3.1.3 自定义步进
(loop for var = init-form [then step-form] ..)

3.1.4 解构变量
(loop for (a b) in '((1 2) (3 4) (5 6)) 
    do (something with a b))

如果你想忽略一个解构列表中的值,可以用NIL代替相应变量的名字。

3.2 局部变量
通常循环需要的变量会在for子句中隐式声明,如果需要额外的变量,可以使用with子句来声明。
(with var [=value-form]) var会在首次迭代前初始化,并在迭代结束后删除。如果有多个with子句,则按顺序求值,且后面的变量可以使用前面声明的局部变量。

3.3 值汇聚 
值汇聚为循环过程中涉及值汇聚的用法提供了简洁的表示法。其形式为:
verb form [ into var ]
每次迭代,汇聚子句对form求值并将其按verb指定的方式保存到into指定的变量中。如果没有into子句,则汇聚出一个默认值作为整个循环表达式返回的值。
可用的动词有collect/append/nconc/count/sum/maximize/minimize,以及其对应的进行时的同义词:collecting/appending/...。
collect子句会构造一个列表,列表中包含排列的所有form的值。append和nconc也汇聚一个列表,但其汇聚的值本身也必须是列表。
其余的动词都用来汇聚数值:count统计form为真的次数;sum收集所有form的值的和;max和min则收集最值。

3.4 无条件执行和条件执行
可以使用do来在循环中执行任意的语句,do后可以接多个语句,这些形式将会全部求值。do子句结束于一个循环的闭合括号或另一个关键字。
(loop for i from 1 to 10 do (forms))

由于do子句可以执行包含任意Lisp形式,因此执行条件控制的构造。
(loop for i from 1 to 10 do (codition-forms))

codition-forms的形式为:(condition test-form action-form)
condition 可以是IF/WHEN/UNLESS等,test-form 可以是任何正规Lisp形式,action-form可以是值汇聚子句、无条件执行子句、另一个条件子句。多个循环子句可以通过AND连成单个条件。

为了便于取值,使用变量it来指代由test-form返回的值。如(loop for key in lst when (gethash key ht) collect it)

return可以从loop中跳出,其后接单个Lisp形式,此形式的值将立即作为整个循环的值返回。
(loop for i from 1 to 10 do (print i) return 100) 将使循环只执行一次。
作为对比,流程控制符,return和return-from可以从任意块中返回。其作用区间比loop大。

对于命名Loop,return-from也可以只从loop中跳出。(loop named outer ...)

下面的例子给出了loop的一些使用方法。
(loop for i from 1 to 100
      if (evenp i)
        minimize i into min-even and 
        maximize i into max-even and
        unless (zerop (mod i 4))
          sum i into even-not-fours-total
        end
        and sum i into even-total
      else
        minimize i into min-odd and
        maximize i into max-odd and
        when (zerop (mod i 5)) 
          sum i into fives-total
        end
        and sum i into odd-total
      do (update-analysis min-even
                          max-even
                          min-odd
                          max-odd
                          even-total
                          odd-total
                          fives-total
                          even-not-fours-total))

3.5 设置与拆除
Loop提供 了initially和finally用于引入那些原本会运行在循环主体以外的代码。
所有initially形式会被组合成一个序言,在所有局部循环变量初始化以后并在循环体开始之前运行一次。而finally形式则简单地组合成一个尾声,在循环体的最后一次迭代结束以后运行。序言和尾声可以引用局部循环变量。

即使循环执行了0次,序言也会执行;但尾声在以下情况下时不执行:执行了return子句;return/return-from或其他流程操作符被调用;循环被always、never、thereis子句终止。

3.6 终止测试
在Loop中关键字while until always never thereis用来终止循环测试。其形式为key-word test-form。五种子句都会在每次执行迭代时对test-form求值,然后判断是否进行终止。

while和until代表温和的终止。当它们终止循环时,控制会跳过循环的其他部分,传到尾声部分。

always、never和thereis则终止循环,同时跳过尾声部分的执行。它们还提供了自己的返回值,因此不能和汇聚类子句配合使用,除非汇聚子句带有into子句。always和never返回布尔值。

alway和never用于检测test-form始终为真或为假。而thereis检测曾经真过。如果真过,则返回此值并结束循环。否则返回NIL。
(loop for char across "abc123" thereis (digit-char-p char)) ==> 1

LISP Examples 极为难得的common lisp语言的程序示例,值得借鉴参考。相关资源极少。 立即下载

相关推荐

DRAM 埋入式字线(Buried Wordline)技术深度解析:从二维平面到三维凹槽

埋入式字线(bWL)及其核心的埋入式沟道阵列晶体管(BCAT)架构,无疑是 DRAM 发展史上的一次关键性革命。它在约 40nm 技术节点被行业主流采纳,成功地帮助 DRAM 产业克服了传统平面晶体管的物理缩放极限。力挽狂澜的续命技术:bWL 通过引入三维沟道结构,从根本上解决了由短沟道效应和漏电流失控引发的数据保持危机,为经典的 1T1C(单晶体管 - 单电容)DRAM 单元架构延续了超过十年的生命力。协同优化的基石技术。

m0_37606066的博客 3325

lisp format总结

1: 基本格式化 (format destination control-string &rest format-arguments) (输出目的 控制字符串 格式化参数)  @,冒号 --> 修饰符  ~A,~D  -->控制字符串  V,#,十进制数字  --> 前置参数 (关键是寻找到底是用一个子句) ~A/~S 都可以使用任何类型的格式化参数,~S试图

ryuali2010的专栏 3286

基于Simulink的二相混合式步进电机驱动器快速建模与仿真实践

本文详细介绍了如何利用Simulink对二相混合式步进电机驱动器进行快速建模与仿真。通过从零搭建电机数学模型、设计H桥控制逻辑,并集成步进时序,手把手指导读者创建可运行的仿真模型文件。该方法能有效验证控制策略,避免硬件调试风险,是学习与实践电机驱动开发的理想途径。

weixin_29171087的博客 147

Lisp语言:循环控制

了解了Lisp语言的条件判断,让我们看看Lisp语言的循环控制。对于稍有编程经验的人来说,循环是比较容易理解的,一般语言里面的循环无外乎for循环,while循环,do until循环等,有些语言的循环稍微复杂一点,也不过是一些变化形式。而Lisp语言里的循环却不是这么简单,查找Lisp中loop的使用就可以发现一系列的资料,有关于loop的简单使用的,有关于loop的高阶使用的,仔细看起来会觉得...

mmdev 1114

从病毒分析到安全研究:手把手教你用OD破解加壳程序的反调试机制

本文深入探讨了如何识别并绕过加壳程序的反调试机制,特别是针对使用IsDebuggerPresent等API检测的防护手段。通过实战案例和工具链配置,详细介绍了逆向工程中的关键技巧,包括内存补丁、硬件断点定位OEP等,帮助安全研究人员有效突破软件保护技术。

tgb345678的博客 823

从零到一:Admin.NET中Swagger与Knife4jUI的深度集成实践

本文详细介绍了在Admin.NET框架中深度集成Swagger与Knife4jUI的实践方法,从基础配置到高级定制,包括认证配置、安全增强、界面主题定制等。通过Furion框架简化配置,开发者可以快速构建专业且友好的API文档界面,提升团队协作效率。

defi6farmer的博客 407

lisp数字格式化

1)、按任意进制(2~36)输出 ;比如按3进制输出 (format t "~3r" 34) ;1021 2)、指定宽度输出 ;8位宽度 (format t "~3,8r" 34); 1021 3)、指定宽度,并设置填充字符 ;8位宽度,#填充 (format t "~3,8,'#r" 34) ;####1021 4)、输出指定宽度及对齐方式 ;左对齐 (format ...

qingshuiaishui的专栏 810

3D Slicer中安装MedSAM插件

大家应该都读过这篇论文:《Segment Anything in Medical Images》这个插件便是该论文团队推出的在3D Slicer上使用的插件,可以分割医学图像的任何感兴趣区域。

m0_73719342的博客 2329

lisp 利器 format 语法示例 控制字符

lisp 里的format 是输出的利器,不亚于c 语言的printf() 我们主要展示 控制字符的行为: 注意 ~s 是输出 “” 的 ~a 是不输出的。~10s ~10a 指定宽带,空格后置 ~...

cudi7618的博客 607

YOLOv8中间特征层可视化

在通过观察这些特征,可以清楚地看到模型如何逐步将输入图像转化为有意义的表示。

weixin_45314480的博客 6889

LED背光驱动电路解析:从MP3394芯片到液晶屏灯管控制

本文深入解析了以MP3394芯片为核心的LED背光驱动电路工作原理。从升压电路的能量转换到多路LED的均流控制,详细阐述了其作为液晶屏背光“大脑”的关键作用,并提供了黑屏、闪屏、亮度不均等常见故障的实战检修思路与排查方法。

agile9scrum的博客 817

279_common lisp Format小结

完整的emacs and lisp的学习集合整理如下: https://github.com/GreyZhang/g_lisp 继续学习emacs,继续学习lisp。这一次小结一下common lisp中的format。 上面是一个加单的小例子,format函数传入了两个参数。第一个参数,指定的是输出的stream,第二个参数是输出信息。这里,输出的stream是nil,...

小灰笔记 1053

9篇6章7节:SEER 数据库的2025年数据变量多条件组合选择(2026年版)

软件中的病例筛选功能通过CaseSelection界面实现精准研究队列构建。该界面允许用户通过变量选择(Variable)、运算符定义(Operator)和取值设定(Values)三步操作创建筛选条件,支持种族、分期等关键变量的多条件组合。

MD Code 1454

循环退出、流程控制-while

循环退出,流程控制 for循环:针对列表,文件循环 while循环:针对条件循环 while expression: # 直到表达式变为假,才退出循环 statement(s) while expression: # 直到表达式变为假,才执行 else 语句 statement(s) else: statement(s...

weixin_34290352的博客 401

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Common Lisp 超规范(译文):6.循环

6. 循环 6.1 LOOP 机制 6.2 迭代字典 6.1 LOOP 机制 6.1.1 Loop 机制概述 6.1.2 变量初始化和步进 6.1.3 值累积子句 6.1.4 终止测试子句 6.1.5 无条件执行子句 6.1.6 条件执行子句 6.1.7 其他子句 6.1.8 其他 Loop 特性的示例 6.1.9 Lo...

乐征skyline 1058

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

k/3Cloud 列表行颜色

using Kingdee.BOS.Core.CommonFilter;using Kingdee.BOS.Core.DynamicForm;using Kingdee.BOS.Core.DynamicForm.PlugIn.ControlModel;using Kingdee.BOS.Core.List;using Kingdee.BOS.Core.List.PlugIn;using Kingd

qq_26114343的博客 577

Parinfer-Rust: 快速且强大的Lisp代码格式化工具

Parinfer-Rust: 快速且强大的Lisp代码格式化工具 项目介绍 Parinfer-Rust 是一个由 Rust 编写的高度优化实现,旨在提升 Lisp 类语言(如 Clojure)的代码格式一致性。它通过智能分析代码中的缩进和括号来自动调整代码布局,使代码风格统一而无需繁琐的手动调整。此项目不仅提供了命令行工具,还支持多种编辑器插件,确保开发者的编辑体验既高效又符合编码规范。支持的编辑...

gitblog_00336的博客 569

lisp-format初步格式输出和数字判定

0] (format t "~a~%~a" "asafadf" "11111")asafadf11111NIL     0[5] (parse-integer "aaa2":junk-allowed t) NIL00[5] (parse-integer "5552":junk-allowed t) 555240[5]

深未来技术 513

Common Lisp入门笔记(三)条件和循环

一、条件 在Lisp中用原子t 表示真,nil表示假。 一般说来,函数名以字母 p 的 lisp 函数用于检验对象具有某种属性。例如,symbolp,listp,keywordp,boundp,fboundp,numberp,typep,oddp,evenp,zerop。 像这一类返回值为真或假的函数称为微词 predicate 。 1、typep 用于测试某个对象是否具有指定的类型。 如

2799

2026年ESI排名解析:中国高校科研竞争力与全球格局

ESI(基本科学指标)作为衡量科研机构学术影响力的核心指标,通过论文被引数据反映学科竞争力。其滚动十年的统计周期能有效过滤短期波动,突出长期科研积累价值。在科研评价体系中,ESI数据常用于学科定位分析、人才评估和前沿方向研判。从最新排名可见,中国高校在工程学、材料科学等领域已形成集群优势,但与国际顶尖机构相比,在篇均被引、学科交叉等质量指标上仍有提升空间。随着科研评价体系改革,ESI数据正与成果转化、社会影响等新维度形成互补,共同构建更全面的科研评估框架。

weixin_34241036的博客 499

存储过程三种循环(while、repeat、loop)、跳出循环讲解及例题

while循环 [begin_label:] WHILE search_condition DO statement_list; END WHILE [end_label]; 先判断条件是否成立,成立就执行SQL语句,当条件不成立就退出 1.条件,一定避免死循环!!!! 2.SQL语句体 3.程序体里面...

weixin_44569143的博客 7095

mysql while,loop,repeat循环,符合条件跳出循环

1、while循环 DELIMITER $$ DROP PROCEDURE IF EXISTS `sp_test_while`$$ CREATE PROCEDURE `sp_test_while`( IN p_number INT, #要循环的次数 IN p_startid INT #循环的其实值 ) BEGIN DECLARE v_val INT DEFAULT 0;

gushens的博客 1132

lisp的基础规则表达式(原子表达式和列表表达式)的应用

2.1 形式 (Form) 人可以通过实践来学习一件事,这对于 Lisp 来说特别有效,因为 Lisp 是一门交互式的语言。任何 Lisp 系统都含有一个交互式的前端,叫做顶层(toplevel)。你在顶层输入 Lisp 表达式,而系统会显示它们的值。 Lisp 通常会打印一个提示符告诉你,它正在等待你的输入。许多 Common Lisp 的实现用 > 作为顶层提示符。本书也沿用这个符号...

冰影随风的专栏 4323

初识LISP(2)——结构、循环与函数

一、LISP—决策 Construct 描述 cond 这个结构是用于用于检查多个测试行动作条件。它可以嵌套if或其他编程语言语句。 if if结构有多种形式。在最简单的形式,它后面跟着一个测试条,测试操作和一些其它相应措施(次)。如果测试子句的值为true,那么测试的动作被执行,否则,由此产生的子句求值。 when

梅雨心情的博客 4502

lambda的peek,filter,map,collect函数使用

@RequestMapping(value = "/list.json", method = GET) public void list(ModelMap modelMap, String taskId, Integer currentPage, Integer pageSize) { Pagination pagination = Pagination.builder().curren...

scofen的博客 1万+

Lisp语言的循环实现

定义宏使用defmacro关键字。宏的语法类似于函数,但它们在编译阶段进行展开。Lisp语言为循环实现提供了多种方式,从传统的loopdotimesdolist构造,到递归和宏的灵活使用,程序员可以根据实际需求选择合适的方法。尽管Lisp的循环机制与其他编程语言有所不同,但它的强大与灵活性使得程序员能够高效地解决各种问题。无论是在处理迭代任务还是利用递归解决复杂问题,Lisp的循环实现均展示了其优雅与简洁。随着对Lisp语言深入的理解和掌握,我们可以更高效地利用这些特性,创造出更具表现力和效率的代码。

2501_90777066的博客 1016
上一篇: Common Lisp学习之九:使用包
下一篇: Common Lisp学习之十一:使用宏
zzulp
博客等级 码龄19年 464粉丝 176原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值