当前位置: 首页 > news >正文

Lisp 语言入门教程(一)

Lisp(“LISt Processing”)是一种古老而强大的编程语言,特别适合处理符号数据和列表。Lisp 是一种以括号和递归见长的语言,它启发了许多编程范式。以下是一个基础教程,帮助你快速了解 Lisp 的基本语法和功能。

1. 认识 Lisp 的基本特性

Lisp 的核心思想是“代码即数据,数据即代码”。在 Lisp 中,代码是由列表(list)构成的,而列表的本质是括号包裹的表达式。典型的 Lisp 表达式格式如下:

(操作符 参数1 参数2 ...)

例如,(+ 1 2) 表示“1 加 2”,相当于其他编程语言中的 1 + 2

2. Lisp 基础语法

(1) 数据类型

Lisp 支持多种数据类型,最常用的有:

  • 数字:整数、浮点数,如 423.14
  • 布尔值:Lisp 中 T 表示真,NIL 表示假
  • 符号(Symbol):用于变量和函数名,如 xmy-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&#xff08;“LISt Processing”&#xff09;是一种古老而强大的编程语言&#xff0c;特别适合处理符号数据和列表。Lisp 是一种以括号和递归见长的语言&#xff0c;它启发了许多编程范式。以下是一个基础教程&#xff0c;帮助你快速了解 Lisp 的基本语法和功能。 1. 认识…...

Git - Think in Git

记录一些使用Git时的一些想法 区的概念 当 clone 仓库代码到本地后四个区相同 当编辑代码后&#xff0c;工作区 与其余三个区不同 当使用 add 将修改的代码暂存后&#xff0c;索引区与 工作区 相同 当使用 commit 将修改的代码提交后&#xff0c;仓库区 与 索引区 和 工作区 相…...

jmeter常用配置元件介绍总结之用linux服务器压测

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

VL210-Q4 适用于USB延长线 扩展坞

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

怎么样绑定域名到AWS(亚马逊云)服务器

1&#xff0c;拿着你买的域名去亚马逊申请一个证书。申请证书分两种&#xff0c;一种是去亚马逊后台填域名手动申请 &#xff0c;另一种是通过API来申请&#xff0c;类似如下代码&#xff1a; 2、证验证书。有两种方式&#xff1a;一种是通过邮件&#xff0c;另一种去到域名提供…...

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

FFmpeg 4.3 音视频-多路H265监控录放C++开发十三.2:avpacket中包含多个 NALU如何解析头部分析

前提&#xff1a; 注意的是&#xff1a;我们这里是从avframe转换成avpacket 后&#xff0c;从avpacket中查看NALU。 在实际开发中&#xff0c;我们有可能是从摄像头中拿到 RGB 或者 PCM&#xff0c;然后将pcm打包成avframe&#xff0c;然后将avframe转换成avpacket&#xff0…...

【MATLAB】目标检测初探

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

SpringCloud 微服务消息队列灰度方案 (RocketMQ 4.x)

目录 背景遇到的问题 RocketMQ 基础基础消息模型扩展后的消息模型部署模型相关概念点 方案对比影子Topic的方案Tag的方案UserProperty的方案影子Group的方案灰度分区的方案方案对比 灰度分区方案设计适配只有部分灰度的情况所做的功能扩展消费者&#xff08;无灰度&#xff09;…...

厘清标准差和标准误:因果推断的统计学基础

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

GESP4级考试语法知识(贪心算法(二))

排队接水2代码&#xff1a; #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 桌面包含的面板如下&#xff1a; 当前文件夹 - 此面板允许访问项目文件夹和文件。命令窗口 - 这是主要区域&#xff0c;用户在命令行中输入命令&#xff0c;命令提示符(>>).工作区 - 工作区显示所有变量&#xff0c;无论是创…...

LeetCode 热题100(八)【二叉树】(3)

目录 8.11二叉树展开为链表&#xff08;中等&#xff09; 8.12从前序与中序遍历序列构造二叉树&#xff08;中等&#xff09; 8.13路径总和III&#xff08;中等&#xff09; 8.14二叉树的最近公共祖先&#xff08;中等&#xff09; 8.15二叉树中的最大路径和&#xff08;困…...

uniapp h5实现录音

使用npm安装 npm install recorder-core引入Recorder库 可以使用import、require、html script等你适合的方式来引入js文件&#xff0c;下面的以import为主要参考&#xff0c;其他引入方式根据文件路径自行调整一下就可以了。 //必须引入的Recorder核心&#xff08;文件路径是…...

字节跳动Android面试题汇总及参考答案(80+面试题,持续更新)

Android 四大组件是什么? Android 四大组件分别是 Activity、Service、Broadcast Receiver 和 Content Provider。 Activity 是 Android 应用中最基本的组件,用于实现用户界面。它可以包含各种视图控件,如按钮、文本框等。一个 Activity 通常对应一个屏幕的内容。用户可以通…...

【go从零单排】通道select、通道timeout、Non-Blocking Channel Operations非阻塞通道操作

&#x1f308;Don’t worry , just coding! 内耗与overthinking只会削弱你的精力&#xff0c;虚度你的光阴&#xff0c;每天迈出一小步&#xff0c;回头时发现已经走了很远。 &#x1f4d7;概念 select 语句是 Go 的一种控制结构&#xff0c;用于等待多个通道操作。它类似于 s…...

PSRR仿真笔记

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

AUTOSAR_EXP_ARAComAPI的7章笔记(3)

☞返回总目录 相关总结&#xff1a;AutoSar AP简单多绑定总结 7.3 多绑定 如在 5.4.3 小节中简要讨论的&#xff0c;某个代理类 / 骨架类的不同实例之间的技术传输是不同的&#xff0c;多绑定描述了这种情况的解决方案。多种技术原因都可能导致这种情况出现&#xff1a; 代…...

WSADATA 关键字详细介绍

WSADATA 是 Windows Sockets API&#xff08;Winsock&#xff09;中用于存储 Winsock 库的初始化信息的结构体。在使用 Winsock API 之前&#xff0c;必须通过调用 WSAStartup() 函数进行初始化&#xff0c;WSADATA 结构体用于接收有关 Winsock 库版本的信息。Winsock 是 Windo…...

R语言AI模型部署方案:精准离线运行详解

R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

ssc377d修改flash分区大小

1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

【位运算】消失的两个数字(hard)

消失的两个数字&#xff08;hard&#xff09; 题⽬描述&#xff1a;解法&#xff08;位运算&#xff09;&#xff1a;Java 算法代码&#xff1a;更简便代码 题⽬链接&#xff1a;⾯试题 17.19. 消失的两个数字 题⽬描述&#xff1a; 给定⼀个数组&#xff0c;包含从 1 到 N 所有…...

基于Flask实现的医疗保险欺诈识别监测模型

基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施&#xff0c;由雇主和个人按一定比例缴纳保险费&#xff0c;建立社会医疗保险基金&#xff0c;支付雇员医疗费用的一种医疗保险制度&#xff0c; 它是促进社会文明和进步的…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...

Xen Server服务器释放磁盘空间

disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...

动态 Web 开发技术入门篇

一、HTTP 协议核心 1.1 HTTP 基础 协议全称 &#xff1a;HyperText Transfer Protocol&#xff08;超文本传输协议&#xff09; 默认端口 &#xff1a;HTTP 使用 80 端口&#xff0c;HTTPS 使用 443 端口。 请求方法 &#xff1a; GET &#xff1a;用于获取资源&#xff0c;…...

【SpringBoot自动化部署】

SpringBoot自动化部署方法 使用Jenkins进行持续集成与部署 Jenkins是最常用的自动化部署工具之一&#xff0c;能够实现代码拉取、构建、测试和部署的全流程自动化。 配置Jenkins任务时&#xff0c;需要添加Git仓库地址和凭证&#xff0c;设置构建触发器&#xff08;如GitHub…...

渗透实战PortSwigger靶场:lab13存储型DOM XSS详解

进来是需要留言的&#xff0c;先用做简单的 html 标签测试 发现面的</h1>不见了 数据包中找到了一个loadCommentsWithVulnerableEscapeHtml.js 他是把用户输入的<>进行 html 编码&#xff0c;输入的<>当成字符串处理回显到页面中&#xff0c;看来只是把用户输…...