Lisp 语言入门教程(一)
Lisp(“LISt Processing”)是一种古老而强大的编程语言,特别适合处理符号数据和列表。Lisp 是一种以括号和递归见长的语言,它启发了许多编程范式。以下是一个基础教程,帮助你快速了解 Lisp 的基本语法和功能。
1. 认识 Lisp 的基本特性
Lisp 的核心思想是“代码即数据,数据即代码”。在 Lisp 中,代码是由列表(list)构成的,而列表的本质是括号包裹的表达式。典型的 Lisp 表达式格式如下:
(操作符 参数1 参数2 ...)
例如,(+ 1 2)
表示“1 加 2”,相当于其他编程语言中的 1 + 2
。
2. Lisp 基础语法
(1) 数据类型
Lisp 支持多种数据类型,最常用的有:
- 数字:整数、浮点数,如
42
、3.14
- 布尔值:Lisp 中
T
表示真,NIL
表示假 - 符号(Symbol):用于变量和函数名,如
x
、my-var
- 字符串:如
"hello world"
- 列表:Lisp 的核心数据结构,如
'(1 2 3)
或(list 1 2 3)
(2) 基本算术操作
Lisp 中提供了简单的算术运算,以下是几个例子:
(+ 1 2) ; 加法,结果为 3
(- 5 3) ; 减法,结果为 2
(* 2 3) ; 乘法,结果为 6
(/ 10 2) ; 除法,结果为 5
(3) 变量定义
使用 setq
来定义变量:
(setq x 10) ; 将 x 赋值为 10
(setq y (+ x 5)) ; 将 y 赋值为 x + 5 的结果,即 15
(4) 条件判断
Lisp 中的条件语句使用 cond
,类似于其他语言中的 if-else
:
(cond ((> x 0) "x is positive")((< x 0) "x is negative")(t "x is zero"))
其中 t
代表“默认情况”,即当没有其他条件满足时执行的分支。
3. 函数定义
Lisp 的函数定义使用 defun
,格式如下:
(defun 函数名 (参数列表)函数体)
例如,定义一个简单的加法函数:
(defun add (a b)(+ a b))
调用该函数:
(add 2 3) ; 结果为 5
4. 列表操作
Lisp 中列表是非常重要的数据结构,以下是一些基本的列表操作函数:
car
:获取列表的第一个元素cdr
:获取除第一个元素外的其他元素cons
:将一个元素添加到列表开头list
:创建一个新列表
示例:
(setq my-list '(1 2 3 4))
(car my-list) ; 结果为 1
(cdr my-list) ; 结果为 (2 3 4)
(cons 0 my-list) ; 结果为 (0 1 2 3 4)
(list 1 2 3) ; 结果为 (1 2 3)
5. 递归
Lisp 中非常适合使用递归来处理问题。例如,实现一个计算阶乘的递归函数:
(defun factorial (n)(if (<= n 1)1(* n (factorial (- n 1)))))
调用 factorial
函数:
(factorial 5) ; 结果为 120
6. 高阶函数与 mapcar
Lisp 提供了高阶函数(即将函数作为参数传递的函数)。mapcar
是常用的高阶函数,用于对列表中的每个元素应用指定函数:
(mapcar #'1+ '(1 2 3 4)) ; 结果为 (2 3 4 5)
(mapcar (lambda (x) (* x x)) '(1 2 3 4)) ; 结果为 (1 4 9 16)
7. Lambda 表达式
Lambda 表达式用于定义匿名函数,例如:
(lambda (x y) (+ x y))
可以直接使用匿名函数:
(funcall (lambda (x y) (+ x y)) 3 4) ; 结果为 7
8. 宏(macro)
宏允许你在编译阶段改变代码结构。宏和函数类似,但它们操作的是表达式的代码,而不是结果。简单示例:
(defmacro square (x)`(* ,x ,x))(square 4) ; 结果为 16
Lisp 的基本概念和语法并不复杂,但其强大的递归处理能力和符号计算特性让它在特定场景中表现出色。通过掌握基本的列表操作、函数定义、条件语句和宏,你已经具备了在 Lisp 中编写基础程序的能力。
作者简介
前腾讯电子签的前端负责人,现 whentimes tech CTO,专注于前端技术的大咖一枚!一路走来,从小屏到大屏,从 Web 到移动,什么前端难题都见过。热衷于用技术打磨产品,带领团队把复杂的事情做到极简,体验做到极致。喜欢探索新技术,也爱分享一些实战经验,帮助大家少走弯路!
温馨提示:可搜老码小张公号联系导师
相关文章:
Lisp 语言入门教程(一)
Lisp(“LISt Processing”)是一种古老而强大的编程语言,特别适合处理符号数据和列表。Lisp 是一种以括号和递归见长的语言,它启发了许多编程范式。以下是一个基础教程,帮助你快速了解 Lisp 的基本语法和功能。 1. 认识…...
Git - Think in Git
记录一些使用Git时的一些想法 区的概念 当 clone 仓库代码到本地后四个区相同 当编辑代码后,工作区 与其余三个区不同 当使用 add 将修改的代码暂存后,索引区与 工作区 相同 当使用 commit 将修改的代码提交后,仓库区 与 索引区 和 工作区 相…...

jmeter常用配置元件介绍总结之用linux服务器压测
系列文章目录 安装jmeter jmeter常用配置元件介绍总结之用linux服务器压测 1.编写测试脚本2.执行测试脚本 1.编写测试脚本 在linux服务器上进行压测,由于是没有界面的,因此我们可以先在界面上把压测脚本写好: 如图:我这里简单的写…...

VL210-Q4 适用于USB延长线 扩展坞
VL210芯片技术文档 一、概述 VL210是一款由VIA Technologies(威盛电子)生产的第四代先进USB 3.0 Hub控制器。它集成了多种先进技术和功能,适用于各种USB集线器应用,如独立的USB集线器、笔记本/Ultrabook停靠点/port-replicators…...

怎么样绑定域名到AWS(亚马逊云)服务器
1,拿着你买的域名去亚马逊申请一个证书。申请证书分两种,一种是去亚马逊后台填域名手动申请 ,另一种是通过API来申请,类似如下代码: 2、证验证书。有两种方式:一种是通过邮件,另一种去到域名提供…...

Clickhouse集群新建用户、授权以及remote权限问题
新建用户 create user if not exists user on cluster 集群名称 IDENTIFIED WITH plaintext_password BY 密码;给用户授查询、建表、删表的权限 GRANT create table,select,drop table ON 数据库实例.* TO user on cluster 集群名称 ;在其他节点下用户建本地表成功&#…...

OPENCV 检测直线[opencv--3]
opencv中集成了很多好用的函数,比如霍夫变换检测直线的函数,当然,考虑到看我文章的人水平,我这里只讲讲如何使用这个函数,和怎么调节其中的参数 先把运行效果PO出来吧 #include "CV_ERROR.h" #include &q…...

FFmpeg 4.3 音视频-多路H265监控录放C++开发十三.2:avpacket中包含多个 NALU如何解析头部分析
前提: 注意的是:我们这里是从avframe转换成avpacket 后,从avpacket中查看NALU。 在实际开发中,我们有可能是从摄像头中拿到 RGB 或者 PCM,然后将pcm打包成avframe,然后将avframe转换成avpacket࿰…...

【MATLAB】目标检测初探
文章目录 0 前言1 目标检测概述2 算法实践2.1 YOLO v22.2 YOLO v3 3 项目实践3.1 项目背景和数据集3.2 实践结果3.3 算法对比 4 工具箱与数据标注5 总结 0 前言 之前因为项目原因,做了一个基于YOLOv5实现目标检测的程序,是基于Python做的,直接…...

SpringCloud 微服务消息队列灰度方案 (RocketMQ 4.x)
目录 背景遇到的问题 RocketMQ 基础基础消息模型扩展后的消息模型部署模型相关概念点 方案对比影子Topic的方案Tag的方案UserProperty的方案影子Group的方案灰度分区的方案方案对比 灰度分区方案设计适配只有部分灰度的情况所做的功能扩展消费者(无灰度)…...

厘清标准差和标准误:因果推断的统计学基础
标准差,指 一次抽样中 个体取值间的离散程度,反映了 个体取值对样本均值的代表性。 标准误,指 多次抽样中 样本均值间的离散程度,反映了 样本均值对总体均值的代表性。 公众号原文-厘清标准差和标准误:因果推断的统计…...

GESP4级考试语法知识(贪心算法(二))
排队接水2代码: #include<iostream> #include<cstdio> #include<algorithm> using namespace std; struct people {int num;int time; }; people s[1001]; int n,r,a[1001]; double sum,ave; bool cmp(people x,people y) {return x.time<y.t…...

MATLAB 使用教程 —— 命令窗口输入命令,工作区显示变量
命令在命令窗口输入变量在工作区显示 MATLAB 桌面包含的面板如下: 当前文件夹 - 此面板允许访问项目文件夹和文件。命令窗口 - 这是主要区域,用户在命令行中输入命令,命令提示符(>>).工作区 - 工作区显示所有变量,无论是创…...

LeetCode 热题100(八)【二叉树】(3)
目录 8.11二叉树展开为链表(中等) 8.12从前序与中序遍历序列构造二叉树(中等) 8.13路径总和III(中等) 8.14二叉树的最近公共祖先(中等) 8.15二叉树中的最大路径和(困…...
uniapp h5实现录音
使用npm安装 npm install recorder-core引入Recorder库 可以使用import、require、html script等你适合的方式来引入js文件,下面的以import为主要参考,其他引入方式根据文件路径自行调整一下就可以了。 //必须引入的Recorder核心(文件路径是…...
字节跳动Android面试题汇总及参考答案(80+面试题,持续更新)
Android 四大组件是什么? Android 四大组件分别是 Activity、Service、Broadcast Receiver 和 Content Provider。 Activity 是 Android 应用中最基本的组件,用于实现用户界面。它可以包含各种视图控件,如按钮、文本框等。一个 Activity 通常对应一个屏幕的内容。用户可以通…...

【go从零单排】通道select、通道timeout、Non-Blocking Channel Operations非阻塞通道操作
🌈Don’t worry , just coding! 内耗与overthinking只会削弱你的精力,虚度你的光阴,每天迈出一小步,回头时发现已经走了很远。 📗概念 select 语句是 Go 的一种控制结构,用于等待多个通道操作。它类似于 s…...

PSRR仿真笔记
1.首先打开bandgap的testbench电路,选择schematic 2.打开电路后,选择VDD模块,然后按键盘Q,进行编辑,将AC magnitude改为1 V 3.修改完成后,点击左上角Launch > ADE Explorer 4.在出现的窗口中,选择Creat…...

AUTOSAR_EXP_ARAComAPI的7章笔记(3)
☞返回总目录 相关总结:AutoSar AP简单多绑定总结 7.3 多绑定 如在 5.4.3 小节中简要讨论的,某个代理类 / 骨架类的不同实例之间的技术传输是不同的,多绑定描述了这种情况的解决方案。多种技术原因都可能导致这种情况出现: 代…...
WSADATA 关键字详细介绍
WSADATA 是 Windows Sockets API(Winsock)中用于存储 Winsock 库的初始化信息的结构体。在使用 Winsock API 之前,必须通过调用 WSAStartup() 函数进行初始化,WSADATA 结构体用于接收有关 Winsock 库版本的信息。Winsock 是 Windo…...

c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...
日常一水C
多态 言简意赅:就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过,当子类和父类的函数名相同时,会隐藏父类的同名函数转而调用子类的同名函数,如果要调用父类的同名函数,那么就需要对父类进行引用&#…...
Oracle11g安装包
Oracle 11g安装包 适用于windows系统,64位 下载路径 oracle 11g 安装包...
【WebSocket】SpringBoot项目中使用WebSocket
1. 导入坐标 如果springboot父工程没有加入websocket的起步依赖,添加它的坐标的时候需要带上版本号。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dep…...

ui框架-文件列表展示
ui框架-文件列表展示 介绍 UI框架的文件列表展示组件,可以展示文件夹,支持列表展示和图标展示模式。组件提供了丰富的功能和可配置选项,适用于文件管理、文件上传等场景。 功能特性 支持列表模式和网格模式的切换展示支持文件和文件夹的层…...

ubuntu中安装conda的后遗症
缘由: 在编译rk3588的sdk时,遇到编译buildroot失败,提示如下: 提示缺失expect,但是实测相关工具是在的,如下显示: 然后查找借助各个ai工具,重新安装相关的工具,依然无解。 解决&am…...

【记录坑点问题】IDEA运行:maven-resources-production:XX: OOM: Java heap space
问题:IDEA出现maven-resources-production:operation-service: java.lang.OutOfMemoryError: Java heap space 解决方案:将编译的堆内存增加一点 位置:设置setting-》构建菜单build-》编译器Complier...
标注工具核心架构分析——主窗口的图像显示
🏗️ 标注工具核心架构分析 📋 系统概述 主要有两个核心类,采用经典的 Scene-View 架构模式: 🎯 核心类结构 1. AnnotationScene (QGraphicsScene子类) 主要负责标注场景的管理和交互 🔧 关键函数&…...

vxe-table vue 表格复选框多选数据,实现快捷键 Shift 批量选择功能
vxe-table vue 表格复选框多选数据,实现快捷键 Shift 批量选择功能 查看官网:https://vxetable.cn 效果 代码 通过 checkbox-config.isShift 启用批量选中,启用后按住快捷键和鼠标批量选取 <template><div><vxe-grid v-bind"gri…...
MyBatis-Plus 常用条件构造方法
1.常用条件方法 方法 说明eq等于 ne不等于 <>gt大于 >ge大于等于 >lt小于 <le小于等于 <betweenBETWEEN 值1 AND 值2notBetweenNOT BETWEEN 值1 AND 值2likeLIKE %值%notLikeNOT LIKE %值%likeLeftLIKE %值likeRightLIKE 值%isNull字段 IS NULLisNotNull字段…...