首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在Common Lisp中,为什么(if)语句的多表达式主体需要(progn)?

在Common Lisp中,if语句用于根据条件执行不同的代码块。if语句的语法如下:

代码语言:txt
复制
(if condition then-form [else-form])

其中,condition是一个表达式,它的值将决定是执行then-form还是else-formthen-form是当condition的值为非空(true)时执行的代码块,else-form是当condition的值为空(false)时执行的代码块。

if语句的多表达式主体需要progn时,是因为if语句只允许有一个表达式作为then-formelse-form。如果需要执行多个表达式,就需要将它们放在progn中。progn是一个特殊的形式,它允许将多个表达式组合成一个表达式,并按顺序执行它们。

例如,如果我们想要在条件为真时执行两个表达式,可以这样写:

代码语言:txt
复制
(if condition
    (progn
      (do-something)
      (do-something-else))
    (do-something-elsewise))

在这个例子中,当condition为真时,do-somethingdo-something-else两个表达式将被执行。如果condition为假,则执行do-something-elsewise表达式。注意,progn是必要的,因为if语句只允许有一个表达式作为then-formelse-form

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Emacs Lisp

LISP 编程语族已经演变出许多种方言,现代最著名通用编程语种是 Common Lisp 和 Scheme , 以上解释来自 WIKI Emacs LispLisp 一个分支 Emacs Lisp...;; 为了实验本教程lisp命令,我们要让Emacs工作lisp-interaction-mode工作模式下, ;; 这个模式可以让我们缓冲区中和Emacs进行互动,并且直接执行Lisp命令,得到结果...(+ 2 2) ;; Elisp中表达式可以通过括号来嵌套 (+ 2 (+ 1 1)) ;; lisp-interaction-mode模式,我们可以直接计算一个表达式,计算方法是 (+ 3...; 如果不希望Emacs缓冲区插入计算结果,我们还可以达式末尾使用C-x C-e组合键 ;; C-x C-e意思是: 先按下Ctrl-x 再按下Ctrl-e ;; 这个命令会让Emacs辅助缓冲区...变量值为“you” ;; 然后接着执行括号其它语句块部分,这个功能和progn类似 (let ((local-name "you")) (switch-to-buffer-other-window

2.3K40

Emacs Lisp

LISP 编程语族已经演变出许多种方言,现代最著名通用编程语种是 Common Lisp 和 Scheme , 以上解释来自 WIKI Emacs LispLisp 一个分支 Emacs Lisp...;; 为了实验本教程lisp命令,我们要让Emacs工作lisp-interaction-mode工作模式下, ;; 这个模式可以让我们缓冲区中和Emacs进行互动,并且直接执行Lisp命令,得到结果...(+ 2 2) ;; Elisp中表达式可以通过括号来嵌套 (+ 2 (+ 1 1)) ;; lisp-interaction-mode模式,我们可以直接计算一个表达式,计算方法是 (+ 3...; 如果不希望Emacs缓冲区插入计算结果,我们还可以达式末尾使用C-x C-e组合键 ;; C-x C-e意思是: 先按下Ctrl-x 再按下Ctrl-e ;; 这个命令会让Emacs辅助缓冲区...变量值为“you” ;; 然后接着执行括号其它语句块部分,这个功能和progn类似 (let ((local-name "you")) (switch-to-buffer-other-window

2.2K30

Emacs Lisp2

;; 为了实验本教程lisp命令,我们要让Emacs工作lisp-interaction-mode工作模式下,;; 这个模式可以让我们缓冲区中和Emacs进行互动,并且直接执行Lisp命令,得到结果...== 表达式,变量和函数 ==;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 冒号Lisp中表示注释...;; Elisp做运算,调用函数最简单方式是;; (function arg1 arg2) ;; 这相当于通常function(arg1,arg2),下面的表达式,对两个数字进行加法运算(+...2 2);; Elisp中表达式可以通过括号来嵌套(+ 2 (+ 1 1));; lisp-interaction-mode模式,我们可以直接计算一个表达式,计算方法是(+ 3 (+ 1 2));...变量值为“you”;; 然后接着执行括号其它语句块部分,这个功能和progn类似(let ((local-name "you"))(switch-to-buffer-other-window "*

97240

一名ClojurianEmacs配置

另外,为了更好地emacs编写Clojure,还需要cider-mode和clojure-mode支持,这时候就不得不编辑init.el文件,本着KISS (keep it simple, stupid...为了解决这个问题,需要引入模块化思想——把特定功能配置放到独立文件,然后require进来。...按照惯例,我~/.emacs.d目录下建立一个lisp目录用于存放所有自定义模块文件,随后init.el中加入下面这句代码,意在把lisp目录加到emacs加载路径列表里。...(add-to-list 'load-path (expand-file-name "lisp" user-emacs-directory)) 看似,接下来就可以每个独立模块文件编写各种功能配置...换句话说,除非你想编译包含上述代码文件,否则它作用和progn一模一样,顺序地求值包含其中达式

2.7K20

如何用Python编写一个Lisp解释器

几年前,作者曾展示过如何用 Java 和 Common Lisp 写 Schema 解释器。而本次目的很纯粹,作者会尽可能简明扼要为大家进行介绍。 了解这些有多重要呢?...Schema 程序语法和语义 语言语法是指组成正确语句或表达式顺序;语义指那些表达式语句内在含义。...一个简单解释器,内部表示形式是一个树形结构(一般被称为抽象语法树),反应了程序语句和表达式嵌套结构。...计算 (account1 -20.00) 过程,我们对 eval 表达式做了高亮处理。该表达式含三个变量,amt 最内层(绿色)里。...Tony 认为最难部分是表达式解释器;需要Lisp,他知道如何编写 C 程序来处理非 Lisp 字符,并将其链接到 Lisp 程序。

1.3K40

Clojure与LispClojure与Lisp

展开式(演进式) 结构和语法更适合特定问题领域. 你程序运行时候取修改程序,而不需要重新编译或重启 程序....Clojure 高速、干净、具有优先能力和优雅特征. 但是没有改变lisp "代码也是数据" 哲学. Clojure 语言直觉和观感上比历史上lisp更易于阅读....觉得必须实现共同需要一个方法,使计算机能够处理链表符号数据,允许语言处理、信息存入和检索、定理证明过程机器化。IBM是首先对人工智能开发有兴趣商业机构之一。...1960年4月,麦卡锡ACM杂志发表了一片文章《递回函数符号表达式以及由机器运算方式,第一部》....在读取期运行代码,使得用户可以重新调整(reprogram)Lisp语法; 在编译期运行代码,则是Lisp工作基础; 在运行期编译代码,使得Lisp可以Emacs这样程序,充当扩展语言(extension

1.9K30

Java核心技术整理(七)---Lambda表达式

可选大括号:如果主体包含了一个语句,就不需要使用大括号。 可选返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定明表达式返回了一个数值。...:参数列表,箭头(->),以及一个表达式语句块。...函数式编程大量使用函数,减少了代码重复,因此程序比较短,开发速度较快。Paul Graham《黑客与画家》一书中写道:同样功能程序,极端情况下,Lisp代码长度可能是C代码二十分之一。...如果程序员每天所写代码行数基本相同,这就意味着,"C语言需要一年时间完成开发某个功能,Lisp语言只需要不到三星期。反过来说,如果某个新功能,Lisp语言完成开发需要三个月,C语言需要写五年。...“当然,这样对比故意夸大了差异,但是"一个高度竞争市场,即使开发速度只相差两三倍,也足以使得你永远处在落后位置。” 2 .

25610

python几个概念汇总

为什么80%码农都做不了架构师?>>> ?...装饰器本质上是一个 Python 函数或类,它可以让其他函数或类需要做任何代码修改前提下增加额外功能,装饰器返回值也是一个函数/类对象。...lambda这个名称来自于LISP,而LISP则是从lambda calculus(一种符号逻辑形式)取这个名称Python,lambda作为一个关键字,作为引入表达式语法。...相比较 def 函数, lambda 是单一达式,而不是语句块! 所谓匿名,意即不再使用 def 语句这样标准形式定义一个函数。...lambda 只是一个表达式,函数体比 def 简单很多。 lambda主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限逻辑进去。

64320

【Python学习笔记之三】lambda表达式用法小结

除了def语句之外,Python还提供了一种生成函数对象达式形式。由于它与LISP语言中一个工具很相似,所以称为lambda。...lambda主体是一个单个达式,而不是一个代码块。这个lambda主体简单得就好像放在def主体return语句代码一样。简单地将结果写成一个顺畅达式,而不是明确返回。...因为它仅限于表达式,lambda通常要比def功能要小:你仅能够lambda主体中封装有限逻辑进去,连if这样语句都不能够使用。...例如,这种代码片段,可以通过列表常量嵌入lambda表达式创建一个含有三个函数列表。一个def是不会再列表常量工作,因为它是一个语句,而不是一个表达式。...如何(不要)让Python代码变得晦涩难懂 由于lambda主体必须是个表达式(而不是一些语句),由此可见仅能将有限逻辑封装到一个lambda

79850

作为测试人员,这些概念你不懂的话,你好意思说你懂java?

你可以将其想做一种速记,在你需要使用某个方法地方写上它。当某个方法只使用一次,而且定义很简短,使用这种速记替代之尤其有效,这样,你就不必费力写声明与方法了。...例如:a -> return a*a Lambda 表达式主体可包含零条或多条语句 如果 Lambda 表达式主体只有一条语句,花括号 {} 可省略。...匿名函数返回类型与该主体达式一致 如果 Lambda 表达式主体包含一条以上语句,则表达式必须包含在花括号 {} (形成代码块)。...为什么 java 会需要 lambada 表达式? Java 是一流面向对象语言,除了部分简单数据类型,Java 一切都是对象,即使数组也是一种对象,每个类创建实例也是对象。...Pure Lisp, XSLT, XPath, XQuery, FP Haskell (without I/O Monad or UnsafPerformIO) 广义上,函数式编程意味着专注于函数 Lisp

57540

Pythonlambda使用,与它三个好基友介绍!

所以,今天跟大家讲讲关于python几个精致函数 匿名函数lambda 除了def语句,python还提供了一种生成函数对象达式形式。...此外,作为一个表达式,lambda返回一个值(一个新函数),可以选择性赋值给一个变量 相反,def语句总是得头部将一个新函数赋值给一个变量,而不是将这个函数作为结果返回。...lambda主题是单个表达式,而不是一个代码块 这个lambda主题简单就好像放在def主体return语句代码一样。 简单将结果写成一个顺畅达式,而不是明确返回。...但由于它仅限于表达式,故lambda通常要比def功能少…你仅能够lambda主体中封装有限逻辑进去,因为他是一个为编写简单函数而设计。...eg:需要注意一点,mappython3是一个可迭代对象,引入需要使用列表调用来使它生成所有的结果用于显示,python2不必如此。

44620

Emacs 折腾记

我工作倒并没有用得到 Lisp 地方,但是最近眼前晃过一些书,比如《计算机程序构造和解释》、《码农》杂志第 13 期,都对这门古老语言推崇备至,历数现代 Lisp 方言先进性,再者我也一直有学习一门函数式编程语言想法...Common Lisp 开发环境 学习 Common Lisp 是使用 Emacs 最主要任务,配好了文本编辑,当然得先把 Common Lisp 开发环境配置好了。...本来什么也不用配置情况下 M-x ielm 就能进入一个 Emacs Lisp REPL,但是它与 Common Lisp 毕竟还是有区别,所以还是另配置一个。... ~/.emacs 文件里加上: M-x slime 就可以进入到 REPL 进行 Common Lisp 学习了。... ~/.emacs 文件添加 这个 3 表示距离屏幕上下边缘还有 3 行时候再移动光标即自动滚屏,方便随时能看到当前编辑行上下文,可以根据自己使用习惯调整。

1.3K20

Lisp本质(The Nature of Lisp)学习思考

和别人争论了数个小时之后, 我最终还是放弃了学Lisp念头。为什么要花费几个月时间学习语法这么难看语言呢? 这种语言概念这么晦涩, 又没什么好懂例子。也许这语言不是该我这样的人学。...源代码解析之后也是用树结构来存放, 任何编译程序都会把源代码解析成一棵抽象语法树, 这样表示法很恰当, 因为源代码就是层次结构: 函数包含参数和代码块, 代码快包含表达式语句, 语句包含变量和运算符等等...一个问题是, 为什么要用代码来写代码呢? 实际编程, 怎样做到这一点呢? 到底元编程是什么意思? 你大概已经听说过这些问题答案, 但是并不懂得其中缘由。...例如, 上面曾经将过C求三次方宏, 用Lisp来写是这样子: (defmacro triple (x) `(+ ~x ~x ~x)) (译注: Common Lisp, 此处单引号应当是反单引号..., 意思是对表不求值, 但可以对表某元素求值, 记号~表示对元素x求值, 这个求值记号Common Lisp应当是逗号。

1.7K60
领券