C程序员驯服Common Lisp - 入门 - [语言探索]<转载>

Common Lisp 概览 先说一说我对Common Lisp函数式编程语言的个人理解, 首先函数分为:声明,定义和调用。 在c语言中,.h文件 实现函数的声明,.c文件 实现函数的定义。 而在Common List中,函数的声明和定义结合在一起,例如 (defun sum (alist) ...)defun为函数声明的关键字,sum为函数名,alist为函数参数。 (sum alist)上述代码为函数调用的代码 阅读详情
 版权声明:转载时请以超链接形式标明文章原始出处和作者信息及 本声明
http://bigwhite.blogbus.com/logs/158733479.html

毫无疑问,Common Lisp是一门庞大且复杂的语言,学习曲线并不平坦。对于一个从未接触过函数式语言、交互式语言以及动态类型语言的C程序员来说,学习Common Lisp显然是一个很大的挑战。

也许有人会问:"C语言已经无所不能了,为何还要学习Common Lisp?"在这里我不想说太多冠冕堂皇的话,至少对我而言,理由有三:
一是好奇,在C语言的世界里待得久了,总想探出头来吸几口新鲜空气,这次我选择了Common Lisp;
二是为了变成一名更好的程序员。为何学习Common Lisp就能成为一名更好的程序员呢?这不是我的观点,而是诸多牛人或大师们(包括Paul Graham、Peter Norvig以及另外一个Peter:Peter Seibel等)的观点。不过不管你们信不信,反正我是信了。这个观点的关键思想就是一门语言可以影响一个程序员的思维方式。我相信Common Lisp可以给我带来一种不同于以往的新的编程思维方式,这样至少比只有一种思维方式要好,不是吗;
最后,Lisp是一门可编程的编程语言,可以很容易扩展自身并且创造一门新的语言。我无法不动心于如此一门强大的语言。

学习总是需要一些付出的。Jolt大奖得主《Practical Common Lisp》的作者Peter Seibel花了一年的时间放下一切潜心学习Common Lisp并终有所成。我们还有工作,有生活压力,无法像Seibel那样潇洒,但我们依旧可以去学习Common Lisp,循序渐进地学,一步一步来"驯服"Common Lisp这个"猛兽"。"猛兽"被驯服后,才能为你所用,发挥出异常的威力,不是吗?我们需要的仅是恒心和足够的耐心罢了。

"驯服"意味着"学会",何为学会一门语言?只是知晓语法,看懂代码还远远不够,那些仅仅叫知道或了解或"纸上谈兵",还谈不上真正地"学会"。古人云:"学以致用",只有在实际中可以灵活自如的使用了,才叫真正的"学会"了。

现在只是开始!这里我会按照C程序员学习C语言的逻辑展开,为了更加贴近C程序员的思维模式,我选择了这种相对平滑的学习方式。也许最初的几篇会让你觉得Common Lisp很像一门命令式语言^_^!

言归正传!学习一门编程语言之前,最好先弄清楚该语言在当前众多语言中的位置,了解一下它的前世今生,这有助于你对这门语言的认知。不过关于Common Lisp的详细历史这里就不赘述了,在进行下面内容之前,请先阅读一下维基百科,或是读读几本经典Common Lisp书籍(如《ANSI Common Lisp》、《On Lisp》以及《Practical Common Lisp》等)中对Common Lisp历史的介绍。

Common Lisp是Lisp语言大家族中的一分子,和Scheme等一样,它也是一门Lisp方言(Dialect)。与C语言相比,Lisp更加古老,是史上第二古老的编程语言,仅次于Fortran。但Common Lisp比C年轻,它是在上世纪80年代诞生的。与C语言普遍采用的"编辑->编译->调试/执行"的工作方式不同,Common Lisp更多采用的是类似于Python、Ruby那样的交互式的解释器工作模式。你在Common Lisp交互环境中就可以完成上述C语言的所有步骤。这种方式目前看来更易于语言的学习(虽然C语言目前也有解释器的实现,如Ch,但C程序员似乎更喜欢传统方式)。

目前市面上Common Lisp的实现有很多种,既有商业收费的,也有开源免费的。商业软件这里就不提了,常用的免费开源的主流Common Lisp解释器包括CLISP、SBCL(Steel Bank Common Lisp)和Clozure CL。我个人更喜欢使用CLISP,所以后续有关解释器方面的内容更多以CLISP为主。

CLISP支持诸多平台,你可以很容易得到安装包并顺利的完成安装,关于这方面内容这里就不赘述了。打开一个终端(Windows下打开一个命令行窗口),敲入"clisp",回车,你就进入到CLISP提供的Common Lisp顶层环境(Top-Level)当中了(若要进入SBCL,敲入sbcl;若要进入Clozure CL,敲入ccl,以上的前提是这些包的可执行程序路径已经加入到你的PATH环境变量中了),就像这样:

$ clisp
... ...
Welcome to GNU CLISP 2.44.1 (2008-02-23) <http://clisp.cons.org/>

Copyright (c) Bruno Haible, Michael Stoll 1992, 1993
Copyright (c) Bruno Haible, Marcus Daniels 1994-1997
Copyright (c) Bruno Haible, Pierpaolo Bernardi, Sam Steingold 1998
Copyright (c) Bruno Haible, Sam Steingold 1999-2000
Copyright (c) Sam Steingold, Bruno Haible 2001-2008

Type :h and hit Enter for context help.

[1]> _

对于所谓的"顶层环境",熟悉Python和Ruby等解释型语言的朋友并不陌生。它就是一个已经加载了标准Common Lisp包的REPL环境。其中REPL是Read-Eval-Print-Loop的缩写。说白了,这就是一个Common Lisp代码的执行环境,你在里面可以输入Common Lisp代码,这些代码可以被直接执行,执行结果也会立刻展现在你的眼前,或如果遇到错误/异常时,你还可以在里面直接进行代码调试。当然了"顶层"还有一个范围(Scope)的概念在里面,用于区分不同变量和函数的作用域。

我们在CLISP中输入一些字符串、字符以及数字以及简单表达式:

[1]> "hello lisp"
"hello lisp"
[2]> #\c
#\c
[3]> 1
1
[4]> (+ 1 2)
3

CLISP对于我们的输入给予了回应:对于字符串、字符(注意Common Lisp的字符表示法很特别,以#\作为前缀,#\c即C语言中的'c')以及数字,CLISP进行了回显(实际上是对输入求值后的结果),对于"(+ 1 2)"这个计算1和2之和的表达式,CLISP给出了求值后的结果。

我们继续输入一个a:

[5]> a

*** - EVAL: variable A has no value
The following restarts are available:
USE-VALUE      :R1      You may input a value to be used instead of A.
STORE-VALUE    :R2      You may input a new value for A.
ABORT          :R3      Abort main loop
Break 1 [6]>

与前面不同的是,这次CLISP给出了错误提示,求值器(evaluator)无法找到a绑定的值,CLISP进入异常处理模式,或称作调试模式。CLISP给出了三种选择:我们选择输入:R3,可以回到top-level主循环;选择输入:R2,则可以为a赋值。

Break 1 [6]> :R2
New A: 5
5
[7]> a
5

SBCL和Clozure CL与CLISP类似,都会有类似的调试模式,退出调试模式的方法参见各自的提示说明即可。

如果要退出CLISP解释器,我们可以输入"(quit)",注意quit两边的括号也是命令的一部分;在SBCL中,我们可以输入(SB-EXT:QUIT)退出;Clozure CL的退出方法与CLISP相同。

Common Lisp源代码是由一组S-expressions(symbolic expression)构成的。什么是S-expression呢?这个在Common Lisp书籍中很难找到答案,因为S-expression是一种组织数据的结构,并不是Lisp独有的,只是Lisp恰好也采用了这种结构来组织存储Lisp的代码和数据罢了。在维基百科上,S-expression有一个递归的定义:"S-expression要么是一个被成为原子(atoms)的单一的数据对象(data object),要么是一个S-expressions列表(list)。数字、数组、字符串以及符号都是原子",比如:

[1]> 13
13
[2]> #(1 2 3)
#(1 2 3)
[3]> "hello"
"hello"
[4]> #'length
#

数字'13'、数组'#(1 2 3)'、字符串"hello"以及符号'length'都是原子。

Lisp将代码和数据都存储于S-expressions当中,这是Lisp与其他主流语言的最大区别之一。我们在编写Common Lisp源码时,需要遵循正确的S-expression格式。前面说过Common Lisp解释器就是一个READ-EVAL-PRINT-LOOP环境,这个环境主要由一个Reader和一个Evaluator构成。Reader负责读取源文件中的文本或者我们在提示符后面输入的文本,检查文本格式是否符合S-Expression要求,直到所有文本都符合格式要求,这样解释器就得到了正确的S-expression:

[1]> (+ 1 2))
3
[2]>
*** - READ from ... >: an object
      cannot start with #\)

通过上面例子可以看出,Reader识别出了不符合S-expression格式的源码文本。

Reader将文本转换为S-expressions后,Evaluator就开始对S-expression进行校验,校验其是否符合Lisp Code的规范形式(Lisp Form)。

下面的例子说明了Evaluator的作用:

[1]> (foo 1 2)
*** - EVAL: undefined function FOO

毫无疑问,(foo 1 2)是一个有效的S-expression,其通过Reader这关是没有问题的。但是当Evaluator对S-expression"(foo 1 2)"进行验证求值时,却发现无法找到函数foo的定义,这行源码不合法。

简单总结Reader和Evaluator的工作流程就是:"源码文本"通过Reader转换为有效的"S-expressions",后者则由Evaluator转换成有效"Lisp Form"并求值得出结果。

Common Lisp初学者常常被那满眼的括号所吓住,不过事实上括号并没有那么"可怕"。括号其实主要是给Common Lisp解释器(Reader和Evaluator)用的,而不是给程序员看的。现今的代码编辑器都很智能,基本上可以消除括号在编程过程中给你带来的影响(要说一点影响没有也不太可能)。

Common Lisp支持多种注释形式。在C语言中我们用'//'进行单行注释(C99标准引入),而Common Lisp的单行注释符号为';'。C语言采用'/*...*/'进行多行注释,Common Lisp使用的是'#|...|#'。Common Lisp还提供了一种大多语言都不具备的注释方式,那就是将注释直接写到紧邻函数定义的参数列表后面的位置上,这样通过Common Lisp提供的工具,我们可以轻松地提取出该函数的注释,并生成代码文档,比如:

[1]> (defun foo (x) "test comments" (+ x 1))
FOO
[2]> (documentation #'foo t)
"test comments"

由于Common Lisp括号众多,一个风格良好的Lisp程序需要通过良好风格的代码缩进来保证,这方面我推荐AI领域大师Peter Norvig若干年前编写的一篇有关优秀Lisp编程风格的文章《Tutorial on Good Lisp Programming Style》。

很多C程序员可能还是习惯于将代码写到文件中。Common Lisp解释器提供了将你的源文件加载到顶层环境并直接使用其中的定义的方法:
;; foo.lisp
(defun foo (x) "test foo"
   (+ x 1))

[1]> (load "foo.lisp")
;; Loading file foo.lisp ...
;; Loaded file foo.lisp
T
[2]> (foo 5)
6

利用load函数我们可将你的源文件加载到顶层环境中,并在顶层环境里使用该源文件中定义的函数。

编程语言初学者总喜欢在终端控制台上看到自己编写的程序的输出结果,那样会产生一种奇妙的成就感,程序员们多陶醉于其中。C程序员最常用的就是printf函数了,Common Lisp中也有与printf等价的函数,它就是format。这里不是专门讲解format函数的,下面仅仅列举一些常见的例子,这些例子应该可以满足你在学习语言初期的需求了:

* 输出整型数
(format t "~d" 1000000) ==> 1000000
(format t "~x" 1000000) ==> f4240
(format t "~o" 1000000) ==> 3641100
(format t "~b" 1000000) ==> 11110100001001000000

上面依次是按十进制、16进制、八进制和二进制输出。

* 输出浮点数
(format t "~f" 3.1415) ==> 3.1415

* 输出字符串
(format t "~a" "hello lisp") ==> hello lisp

* 输出字符
(format t "~c" #\c) ==> c

* 输出换行符
以下借用《ANSI Common Lisp》书中的一个例子:
(format nil "Dear ~a, ~% Our records indicate..." "Mr. Malatesta")
==> "Dear Mr. Malatesta,
 Our records indicate..."

format函数的第一个参数表示是否输出到"标准输出(*STANDARD-OUTPUT*",如果传入t,则表示输出到标准输出设备上。第二个参数与C中的printf函数的第一个参数类似,是一个格式串,不同的是格式串中的指示符(directive)由printf中的'%'变成了'~'。

为了让大家更加直观地了解Common Lisp源代码到底是什么样子的,下面将给出一个Common Lisp的例子程序,这个程序用来计算参数字符串中大写字母的总个数:

我们先给出一个命令式风格的实现版本:
;; upper-char-counter.lisp
(defun upper-char-counter (str)
  (let ((len (length str)) (result 0))
      (do ((i 0 (+ i 1)))
          ((>= i len) result)
        (if (upper-case-p (char str i)) (setf result (1+ result))))))

即使你不懂Common Lisp语法,你也能大致猜测处理这段代码的逻辑,基本上与下面C代码是等价的:
int upper_char_counter(const char *str) {
    int result = 0;
    int len = strlen(str);

    int i = 0;
    while (i < len) {
        if (str[i] >= 'A' && str[i] <= 'Z') {
            result++;
        }
        i++;
    }

    return result;
}
 
下面是一个函数式风格的实现版本:

;; upper-char-counter.lisp
(defun upper-char-counter (str)
   (count-if #'upper-case-p str))

[1]> (load "upper-char-counter.lisp")
;; Loading file upper-char-counter.lisp ...
;; Loaded file upper-char-counter.lisp
T
[2]> (upper-char-counter "a5B6CD!")
3

这个版本的代码显然更加简洁,但理解起来有些难度。函数count-if接受一个函数和一个字符串作为参数,count-if将函数upper-case-p应用于str中的各个字符上,并将返回true(t)的结果个数累加得到最终返回值。

走到这里,我想大家应该对Common Lisp有了一个感性的认识了,至少可以编写一些命令式风格的简单代码或复制一些现存的代码放到顶层环境中执行了。如果真的是这样,那我的目的就达到了^_^。

Common Lisp 编程环境搭建 Emacs 是一款功能强大的文本编辑器,广泛用于 Common Lisp 开发。Emacs 是一款功能强大的文本编辑器,广泛用于 Common Lisp 开发这里以 Emacs 为例进行说明。Emacs 是一款功能强大的文本编辑器,广泛用于 Common Lisp 开发。Emacs 是一款功能强大的文本编辑器,广泛用于 Common Lisp 开发。Emacs 是一款功能强大的文这里以 Emacs 为例进行说明。步骤 3:安装 Emacs这里以 Emacs 为例进行说明。步骤 3:安装 Emacs。 阅读详情

相关推荐

Common Lisp学习资源:练习与解决方案大全

本文还有配套的精品资源,点击获取 简介:Common Lisp是一种历史悠久且应用广泛的编程语言,以其独特的语法、灵活性和强大的宏系统而知名。这个项目“learninglisp”提供了丰富的练习和解决方案,帮助学习者逐步掌握Lisp编程。项目内容包括S表达式的使用,符号计算的能力,以及一系列教程、练习题目、解决方案、测试脚本、代码片段和阅读材料。通过这些资源,学习者可以深入...

weixin_36369848的博客 1366

linux上clisp运行lisp,在多种不同的 Common Lisp 实现(CLISP、CCL、SBCL)中执行shell命令的函数...

开始只知道 CLISP 中的是:(ext:shell…)然后查了一下,发现又多了解了两种,CCL 和 SBCL 分别有两个函数是:(run-program…)(sb-ext:run-program…)接着继续查,发现有人写出这个很不错的函数,包含了好几种用法:(defun sh (cmd)#+clisp(let ((str (ext:run-shell-command cmd :output...

weixin_42608318的博客 510

Common Lisp基础WEB应用教程:BBS论坛系统实践

本文还有配套的精品资源,点击获取 简介:cl-webapp-sample 是一个基于 Common Lisp 的 Web 应用示例,实现了一个基础的论坛(BBS)功能,为学习者提供了学习 Common Lisp Web 开发的实践案例。项目包括使用说明、安装指南、作者信息及版权声明。同时,项目的构建和运行可能涉及到 JavaScript 以增强前端交互,且可能使用 Git ...

weixin_31176789的博客 1808

Common Lisp

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

skyremember的专栏 3367

《人工智能编程范式》教材Lisp代码_akirataguchi115_Common Lisp_下载.zip

《人工智能编程范式》教材Lisp代码_akirataguchi115_Common Lisp_下载.zip

win10删除vmware12后,重新安装失败(遗留注册表问题)解决总结

之前安装过一次VMware虚拟机,后来由于某些已遗忘原因把它卸载了,但是没有卸载完全,为以后安装留下了一些麻烦,现在根据我google很多内容总结后写下了自己的解决办法。 一些我搜的的可以用的VM12的注册码 5A02H-AU243-TZJ49-GTC7K-3C61N ZZ510-DYX47-48ERP-D6XZG-YCKU2 YV5MU-2FX5H-M841P-LZX5X-PYHX8

Jeason的博客 2万+

Common Lisp 初学者快速入门指导

目录 一、简单介绍 1、本文目标2、适用读者3、迭代式学习4、本章内容小结 二、快速上手 1、推荐开发环境 Lispbox2、开发环境简要介绍3、第一个简单的 Lisp 程序4、为程序增加些复杂性5、这么好的程序一定要保存起来6、补充阅读:让程序支持中文符号7、本章内容小结 三、适用...

dreamli199的博客 9008

鸿蒙OS开机动画背后的秘密:从代码到视觉的完整解析(附源码分析)

本文深入解析了鸿蒙OS开机动画的系统级实现原理。从bootanimation服务的启动配置、与Render Service的协同,到基于VSync信号的帧率同步与绘制流水线,结合OpenHarmony源码进行了逐行解读。文章揭示了其事件驱动的优雅退出机制,并探讨了视频支持、多屏适配等高级特性与定制化可能,为开发者理解鸿蒙图形子系统提供了硬核技术视角。

sony5的博客 974

Common Lisp编程初步---环境搭建和外部lisp代码运行

1 介绍Lisp是世界上第二古老的语言,第一古老语言是Fortran。Lisp语言的创立者为John McCarthy,一位人工智能领域里的先驱。该语言自创立以来经历了50多年而不衰,是一种很有生命力的语言。该语言的发展和使用与CMU和MIT两所高校密不可分,在相当长的时期内是这两所高校的大学计算机课程指定语言。在该语言创立之初,除了创建者外,还有其他的一些高校著名学者也参与到了Lisp语言的发展完

陈广智的专栏 1万+

深入解析ISO12233标准:SFR算法从理论到代码实现

本文深入解析ISO12233标准中的SFR算法,从理论到代码实现全面介绍如何量化成像系统的解析力。通过e-SFR算法测量边缘扩散函数(ESF)和空间频率响应(SFR),结合光学原理和实际代码示例,帮助开发者准确评估影像质量。文章包含关键步骤的Python实现和工程优化技巧,适用于相机测试、镜头评估等应用场景。

weixin_29200485的博客 156

华为OD机试_2025 B卷_模拟消息队列(Python,100分)(附详细解题思路)

时间排序:确保事件处理顺序正确消费者管理:集合操作高效维护状态优先级实现:利用消费者ID自然排序边界处理:正确处理空消费者情况。

测试工程师的成长之路 1120

文件操作(二进制文件加密解密)

加密 #include<stdio.h> #include<string.h> void code(char *p,size_t n) { size_t i; for(i = 0; i < n; i++) { p[i] += 3; } } int main() { ...

diaohong5075的博客 3968

有限时间 vs 固定时间 vs 预定时间滑模:稳定性分析与仿真验证方法对比(中)

有限时间滑模控制(FTSMC)和固定时间滑模控制(FixTSMC)是两种重要的控制策略,旨在实现系统状态的快速收敛。FTSMC通过设计滑模面和控制律,确保系统状态在有限时间内收敛到原点,但其收敛时间与初始状态相关。FixTSMC则进一步优化,使收敛时间与初始状态无关,适用于高动态环境,具有更强的鲁棒性和更平滑的控制信号。两种方法均通过李雅普诺夫函数证明其稳定性,并通过仿真验证其有效性。FixTSMC在工程应用中更为可靠,尤其适合安全关键系统。

Lyajpunov的博客 3224

Common Lisp学习之四:简单数据结构及处理

1 字面数值 在CL中,给定类型的数字可以有多种不同的字面表示方式,这些不同的形式将被读取器转化成相同的对象表示。例如10,20/2等都表示10。有理数在读取后都被规范化,分数被化简; 整数语法:[+/-]123456 比值语法:[+/-]1/4.2 整数数值可以以特定的进制进行解释 #b 二进制 #0 八进制 #x 十六进制 #36 三十六进制-数字集合从0-9 A-Z

zzulp的专栏 3900

【Anaconda】conda国内镜像源快速配置指南(清华/阿里云)

本文详细介绍了如何为Anaconda配置国内镜像源(清华/阿里云),以显著提升conda包下载速度并减少安装失败率。通过分步指南和实用技巧,帮助开发者快速完成配置,优化Python开发环境。

weixin_33725722的博客 1488

【WorkBuddy专栏】完结篇暨付费专栏总目录(内容继续更新中)

【WorkBuddy专栏】完结篇和付费内容总目录

AI人人懂 914

计算理论(2): Common Lisp

本文概述了 Common Lisp 的主要特性与使用方法。首先介绍了 S-expression 及列表操作(car, cdr、cons、list),随后讲解了变量绑定的方式(包括全局与局部绑定),并深入说明了函数定义和条件判断的基本语法。接着,文章涵盖了高阶函数(map、reduce 等)、宏系统(宏与函数的区别及示例)、哈希表、defstruct 结构体、属性列表等进阶主题。最后,还简要介绍了使用外部库(如 Trivia)进行模式匹配的途径,以及 SBCL、Quicklisp 的安装和常用参考资料。整体内

AI分享 | 科研日常 470

华为OD机考双机位C卷 - 两个字符串间的最短路径(Java & Python& JS & C/C++ & GO )

华为OD机考双机位C卷 - 两个字符串间的最短路径(OD上机考试双机位C卷)。提供Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。

算法大师! 835

Common Lisp 编程语言深度解析

CommonLisp是Lisp家族的主要方言,作为世界上第二古老的高级编程语言,以其强大的功能和灵活性著称。它采用S-表达式和"代码即数据"的哲学,支持REPL驱动的交互式开发,并拥有独特的宏系统,可实现元编程和语言扩展。CommonLisp融合了函数式、面向对象(通过CLOS)等多种编程范式,提供高性能和动态类型检查,适合人工智能、符号计算和复杂系统开发。尽管学习曲线陡峭,但其卓越的表达力和生产力使其在特定领域保持独特价值。

bulita great world 1423

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

common lisp 下载设置入门

起点linux: https://gist.github.com/jteneycke/7947353windows: http://jaist.dl.sourceforge.net/project/lispstick/lispstick.zip第一次尝试: 创建独立的可执行程序lispstick\Steel Bank Common Lisp\1.1.12 .\sbcl.exe –core sbcl

deyangliu的专栏 2627

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

探索 Common Lisp 实现的全景

Common Lisp 就像那个神秘的朋友,虽然在聚会上认识每一个人,但总是保持一丝神秘。面对众多可用的实现,选择合适的实现可能会让人感到不知所措。别担心!这篇文章将带你踏上旅程,探索 Common Lisp 实现的世界,突出它们的独特特性、能力以及让每个实现都与众不同的特点。

步子哥的博客 1312

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Common Lisp函数的基础知识

正如上一篇文章所述..位置决定了对名字的解释..而在CL中..有很大一部分是函数的解释.. 函数的名字一般只出现在三个地方: 1.函数调用..函数名字出现在列表的开头..后面跟的是其参数..(fun-name arguments*)..参数可以是任意的lisp表达式..这是函数出现最多的地方 2.函数定义..此处函数名字紧跟在defun之后..此时的作用是将函数名字与函数体绑定起来.

886

Starship高级配置教程:如何自定义设置提升游戏画面与性能

Starship(SF64 PC Port)是一款经典游戏的现代移植项目,通过简单的配置调整,你可以显著提升游戏画面质量和运行性能。本教程将带你探索如何通过修改配置文件和调整图形设置,打造个性化的游戏体验。 ## 准备工作:获取与安装Starship 首先需要克隆项目仓库到本地: ```bash git clone https://gitcode.com/gh_mirrors/starship

gitblog_00050的博客 629

Common Lisp 超规范(译文):25.环境

25. 环境 25.1 外部环境 25.2 环境字典 25.1 外部环境 25.1.1 顶层循环 25.1.2 调试工具 25.1.3 环境查询 25.1.4 时间 25.1.1 顶层循环 顶层循环是用户用来和 Common Lisp 系统正常交互的 Common Lisp 机制. 这个循环有时被称为 Lisp read-eval-print 循环[Lisp read-eval-p...

乐征skyline 604

Common Lisp之小试~

看了《黑客与画家》,对Lisp语言比较好奇,于是就弄了本《Lisp使用教程》,有空的时候就学习一下。Lisp的实现有很多,我用的Emacs+sbcl+slime,因为网上资料比较好找。跟着的前几章体验了一下,先记录一下: 在slime中,你会看到 CL-USER> 敲入命令,只要合乎Lisp语法,便会马上得到执行。 在Lisp中,这个过程叫做read-ev...

weixin_30552811的博客 304
上一篇: 用perl实现两数的置换
下一篇: gdb常用命令
acool555
博客等级 码龄24年 23粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值