首页
学习
活动
专区
工具
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 Lisp 是 Lisp 的一个分支 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 Lisp 是 Lisp 的一个分支 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 "*

    98740

    一名Clojurian的Emacs配置

    另外,为了更好地在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.8K20

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

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

    1.4K40

    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 .

    28010

    python中几个概念汇总

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

    65420

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

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

    82550

    Python中lambda的使用,与它的三个好基友介绍!

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

    45420

    作为测试人员,这些概念你不懂的话,你好意思说你懂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

    60440

    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.8K60
    领券