Common Lisp学习之三:使用变量

关于AutoLISP教学,CAD二次开发 阅读详情
Common Lisp支持词法变量和动态变量(Special variable)。在一定程度上,词法变量类似于类C语言中的局部变量,只在特定的作用域中有效,在作用域外部不可见;而动态变量类似于全局变量,访问其的代码可以在任意时刻对其进行重新绑定。

1 变量基础
Common Lisp是一种动态强类型的语言。变量可以指向任意类型的对象,而类型保存在对象信息里,而不是变量上;同时所有的类型错误都会被检测到。

let可以引入新变量。
(let (variables* ) body-form*)
当let表达式被求值时,所有变量赋值将首先被求值,并在body实行之前进行绑定。在let执行结束后,这些变量将重新引用在执行let前它们所引用的内容,如果有的话。在下面的双顺序列表归并排序的代码中可以看到let的使用方法。
(define (merge list1 list2)
  (cond 
    ((empty? list1) list2)
    ((empty? list2) list1)
    (else
     (let ((f1 (car list1))
           (f2 (car list2)))
       (if (< f1 f2)
           (cons f1 (merge (cdr list1) list2))
           (cons f2 (merge list1 (cdr list2))))))))

let*也可以引入新变量,其与let的区别是:let创建的变量只能出现在body中,而let*创建变量可以出现在variables中引用。

函数形参也可以创建绑定。函数形参和Let变量的作用域被限定在引入此变量的形式内部,即函数定义和let形式内部,称之为绑定形式。如果嵌套的引入同名变量的绑定形式,那么内层变量绑定将覆盖外层绑定。类似于类C语言中的局部变量的嵌套。

2 词法变量与闭包
默认情况,CL中所有绑定形式都引入词法作用域变量。当词法作用域与嵌套函数一起使用时,就产生了闭包的概念。
(let ((count 0)) 
   (lambda () 
     (setf count (+ count 1))))

由于let将函数返回出去,当调用时并不在let的绑定形式内部。这时,CL会创建闭包对象,它封闭包装了其外部绑定形式内创建的绑定(此处为count=0)。闭包不仅能访问它所闭合的变量值,还可以保存每次变量变化的新值。闭包中的绑定将不受外部同名变量的影响。
单个闭包可以引用变量来闭合多个变量绑定,也可以多个闭合捕捉同一个绑定。

3 动态变量
CL提供了defvar和defparameter来创建全局变量,二者的区别是前者在变量已定义时,并不修改原有值。
当定义了全局变量后,可以在任意地方引用它。其好处在于不必到处传递它们。

有时我们希望在使用时,临时改变函数中某个变量的值,以实现不同的功能;而闭包的绑定不支持重新的绑定,因此引入动态变量来达到这个目的。例如:
(let ((*stdout* some-other)) (body)) 
在body中的代码引用stdout时都将引用let所建立的绑定,并且当body离开let时,stdout的绑定将随之消失。即在body中将动态查找stdout的绑定,如果当前命名空间内不存在此绑定,则递归向上一层查找。CL中动态变量必须使用special进行声明,而全局变量默认声明为special的。

4 常量 
常量是全局的,可以用defconstant进行定义,约定全局常量的结尾用+结束。

5 赋值
基本语法:(setf place value),当place是一个变量时,则将value绑定到place。
此外CL支持用户自定义数据结构,可以给结构的任意位置赋值。

支持一次设置多个:(setf x 1 y 2)
其返回最后一个被赋值的值。

6 按位置修改
(incr x n) n默认为1
(decr x n)
(rotatef x y) 交换x,y的值
(shiftf x y z) 返回第一个值,并将后续各值向前移动一位
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 阅读详情

相关推荐

Common Lisp语法——变量

变量基础 在Common Lisp中,变量是无类型的。变量在内部表达中会有关联的类型信息,可用于运行时的动态检查。 在Common Lisp中所有的值都存放在对象中(至少从概念上是这样),因此,对一个变量赋一个新的值,将不会影响到它先前所存储的值。但是,如果一个变量持有一个可变对象的引用,则可以通过这个引用来修改这个可变对象。如: (defun foo (x y) (+ x y)) 一旦函

DreamPixel的专栏 1868

Lisp语言:变量以及变量的作用范围

到现在才讨论变量似乎有点迟,在过去的文章中我们已经很多次使用变量。 之所以到现在才讨论变量是因为不想各位因为复杂的变量使用规定感到困惑。如果只是基本使用,理解变量确实可以很简单。就像在之前的几篇文章中,我们使用了很多变量,我们不用进行复杂的讨论也可以理解这些变量。变量的简单使用也就是如何赋值,如何取值。 前面的文章我们使用setq函数对变量赋值,使用时直接通过变量名代表对应的值。如下面这样的代码...

mmdev 494

Common Lisp 概览

先说一说我对Common Lisp函数式编程语言的个人理解, 首先函数分为:声明,定义和调用。 在c语言中,.h文件 实现函数的声明,.c文件 实现函数的定义。 而在Common List中,函数的声明和定义结合在一起,例如 (defun sum (alist) ...)defun为函数声明的关键字,sum为函数名,alist为函数参数。 (sum alist)上述代码为函数调用的代码

持续关注中。。。 1万+

AutoLisp学习笔记1

AutoLisp学习笔记1

转眼之间 一路有你 749

autolisp 系统变量

系统变量是控制某些命令工作方式的设置。 它们可以打开或关闭模式,如“捕捉”、“栅格”或“正交”。 它们可以设置填充图案的默认比例。 它们可以存储关于当前图形和程序配置的信息。 有时为了更改设置用户使用系统变量。 在其他情况下,可以使用系统变量显示当前状态。 例如,GRIDMODE系统变量在用户更改值时打开或关闭点栅格显示。 在这种情况下,GRIDMODE 系统变量在功能上等价于GRID命令。DATE是存储此刻日期的只读系统变量。 可以显示但不能修改该值。 可以透明检查或修改系统变量的设置(即在使用另一个命令时)。但是,新值将直到被中断的命令结束时才会生效。

hpm6750evk2开发板(四)TCP回送(1000M网口)

再接下来我们修改代码,先找到配置网速的地方,肯定是在enet的初始化函数里面,我们一个函数一个函数找,也可以用单步调试一步一步找,结果发现是在enet_init函数里面调用的rtl8211_basic_mode_default_config函数配置网速的,我们把enet_phy_port_speed_100mbps改为enet_phy_port_speed_1000mbps,重新编译运行试试。首先我们复制一份lwip_tcpecho代码,重命名为lwip_tcpecho_RGMII,如下图所示。

Silas1750的博客 921

Common Lisp入门笔记(二)赋值与输入输出

摘自 《Lisp语言- 陈光喜》 一、赋值 (1)let Lisp中使用let来完成局部变量的定义。其形式为:(let  ((var1 exp1)(var2 exp2)…(varn expn))

6349

Stable-Baselines3性能优化:多环境训练对比指南(DummyVecEnv vs SubprocVecEnv)

本文深入对比了Stable-Baselines3中DummyVecEnv与SubprocVecEnv两种向量化环境的性能差异与应用场景。DummyVecEnv适用于轻量级、步进快的环境,调试友好且开销低;而SubprocVecEnv则通过真正的多进程并行,能显著加速计算密集型环境的训练。文章通过基准测试与决策树,指导开发者根据环境计算成本、CPU核心数等关键因素做出最优选择,以实现训练效率最大化。

weixin_29063979的博客 147

Perl中的词法变量

(my)词法变量   Perl中的词法变量可以应用在任何的块和子例程中;   被my 修饰的词法变量对于所属块而言是私有的;   如果变量的定义未出现在任何块中,则该变量对于整个程序文件而言是私有的.   my操作符可以用来修饰标量变量:   如在test.pl中:   #!/user/bin/perl   use strict;    use warnings;   my $num1 = 5;

SHark专栏 2103

CTF-MISC:BUUCTF练习汇总(1-25题,不包括签到题)

解题思路:该题比较基础,wireshark打开过滤HTTP流量包,追踪HTTP流后可以看到base64密文,解密后得到jpg图片,打开图片即可看到flag,在线OCR识别即可提取出flag值。解题思路:zip压缩包解压需要密码,图片中的盲文为解压的密码,解压后得到MP3音频文件,内容为典型的摩斯密码;解题思路:由题目可以为LSB隐写,使用StegSolve打开图片查看最低有效位得到PNG信息,另存为图片后发现是二维码,扫描后即可得到flag。对应摩斯电码为:-.-. - …-. .-- .–. . …

燕麦葡萄干的博客 1万+

从零搭建IoT数据中台:STM32+WebSocket实现边缘设备与Web端实时双向通信

本文详细介绍了如何从零搭建基于STM32和WebSocket协议的IoT数据中台,实现边缘设备与Web端的实时双向通信。通过硬件选型、协议设计、服务器搭建及安全优化,提供了一套低延迟、高并发的企业级解决方案,适用于智能农业和工业监控等场景。

tea88的博客 749

common lisp 学习第四天 变量、宏

//////变量 //引入变量:变量作用域括号内 (let ((x 10) (y 20) z)   ...) 引入变量列表中的变量 (let* ((x 10)         (y (+ x 10))   ...) //全局变量 之前有没有值都可以赋值 (defparameter *count*变量名 0值 "doc描述") 变量未定以才可以赋值,也可以不给定值 (de...

草宝虫的博客 375

UE5Could not be compiled. Try rebuilding from source manually.

UE5Could not be compiled. Try rebuilding from source manually.

weixin_45417260的博客 2770

老古董Lisp实用主义入门教程(10):聪明先生拒(ji)绝(xu)造轮子

聪明先生非常聪明, 他总是能认识到自己的错误: 造轮子, 造轮子, 造轮子;聪明先生学习编程序总是把原理和实践结合起来;要想不造轮子, 就要知道有些什么轮子;聪明先生一忍不住又造了若干个方形的轮子, 每次都是这样, 承认错误, 坚决不改!

withstand的博客 1057

Python实战日志_P4_图书馆Web API服务

目标:使用Flask将图书馆系统升级为RESTful API服务,掌握Web开发基础难度:⭐⭐⭐⭐☆预计学习时间:75分钟前置要求:已完成第3篇《个人图书馆管理系统》

qq_39436086的博客 83

【STM32Cube_14】使用硬件I2C读写环境光强度传感器(BH1750)

本篇详细的记录了如何使用STM32CubeMX配置STM32L431RCT6的硬件I2C外设读取环境光强度传感器数据(BH1750)

Mculover666的博客(嵌入式) 7242

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

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

gitblog_00693的博客 913

Claude Code 100个真实案例 - 用AI搭建LangChain多工具Agent(自主搜索+查询)

本案例展示如何使用 Claude Code 搭建一个 LangChain 多工具 Agent 系统。Agent 能够自主决定调用搜索引擎、数据库查询、天气查询、计算器等工具,像人类助手一样拆解问题并逐步解决。

yueyeguzhuo的专栏 558

208_emacs lisp变量赋值

完整的common lisp的学习集合整理如下: https://github.com/GreyZhang/g_lisp 看emacs的配置的时候,反复看到一个函数setq。从代码意图上看,应该是给变量赋值的。查看相应的帮助如下: 简单 的一个小结:赋值功能,把后面的表达式赋值给前面的变量。应该可以实现多个变量的赋值。 做几个测试如下: ...

小灰笔记 866

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

198_emacs lisp之setq

之前学习了几种编程语言了,都比较顺利。现在想想,其实之前我自己学习的都算是类C的编程语言。近一段时间,尝试学习lisp,从common lisp开始的路线看起来似乎是不容易的。网络上找到的口碑很好的《实用common lisp编程》实在是也不符合我自己的脾胃。或许,这本书我还会继续看下去,但是显然不是现在。一直啃读这本书,解构总是昏昏然。我觉得换一个方向,从emacs lisp开...

小灰笔记 1269

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

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

196_common lisp动态变量定义

记不清从哪里看到的信息说lisp简单,让我有想法开始学习lisp。我随便找了一个看着评价不错的教程《实用common lisp编程》,感觉这个一点都不简单,上手挺难的。教程中,存在大量没有解释过就使用的东西。这让我的学习有点零碎,不够系统。我把我自己学习的所有的记录整理了一下,算是组合成了一个集合。整理的信息链接如下; https://github.com/G...

小灰笔记 863

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

210_emacs lisp通过load加载文件以及函数搜索目录

完整的common lisp的学习集合整理如下: https://github.com/GreyZhang/g_lisp 继续分析spacemacs的配置,分析如下的代码: 这一段代码前面是看过的,不过上次看得时候分析总结的功能为函数add-to-list。这里其实还有一个没有看过的变量,load-path。查看其说明: 这是描述中的一部分。...

小灰笔记 1076

Lisp语言入门教程

Lisp(LISt Processor)是一种函数式编程语言,以其强大的符号处理能力和独特的括号语法著称。它是最早的高级编程语言之一,广泛应用于人工智能、符号计算等领域。Lisp的核心数据结构是链表(List),代码和数据采用相同的表示形式,这种特性称为"同像性"。使用约定全局变量用*包围使用let(y 20))(+ x y));返回30使用defun(* x x))(square 5);返回25。

qeejhp889f的博客 551

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

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

gitblog_00450的博客 418

Common Lisp笔记

在计划学习函数式编程的时候,我一开始打算学习的是 F#。因为我朋友就是在 DTU 上的学,F# 就是 DTU(丹麦理工)开发的。但是由于 F# 和微软的 .NET 绑定,而在 macOS 上,目前版本的 .NET 的是有些问题的,开发非常繁琐,而且某些错误会导致整个解决方案出错,需要重建整个项目。最后就还是选择了 Common Lisp 这个非常古早的函数式编程语言作为开始,后续如果再需要学习 F# 可能也会更快速和容易一些。0,各种实现都有自己的一些特性,有一些实现还与 C、Java 等语言可以融合使用,

ZhongUncle的博客 1198

Common Lisp

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

skyremember的专栏 3367
上一篇: Common Lisp学习之二:使用函数
下一篇: Common Lisp学习之四:简单数据结构及处理
zzulp
博客等级 码龄19年 464粉丝 176原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值