Common Lisp学习之六:文件IO操作与路径名抽象

Common Lisp 编程环境搭建 Emacs 是一款功能强大的文本编辑器,广泛用于 Common Lisp 开发。Emacs 是一款功能强大的文本编辑器,广泛用于 Common Lisp 开发这里以 Emacs 为例进行说明。Emacs 是一款功能强大的文本编辑器,广泛用于 Common Lisp 开发。Emacs 是一款功能强大的文本编辑器,广泛用于 Common Lisp 开发。Emacs 是一款功能强大的文这里以 Emacs 为例进行说明。步骤 3:安装 Emacs这里以 Emacs 为例进行说明。步骤 3:安装 Emacs。 阅读详情
1 打开文件
CL也提供了流的抽象,读取文件的一般方式也是open一个文件,然后在返回的流上,调用read-*函数。

(open "path" &key direction element-type if-not-exist)    根据路径打开一个文件,返回一个流
direction支持选项:input :output :io
if-exist可以控制文件存在时的操作,支持:error,:new-version,:rename,:rename-and-delete,:overwrite,:append
if-does-not-exist用于控制文件不存在时的操作,支持:error,:create,:nil
element-type 用于指定打开方式 如果希望以二进制格式打开,则使用'(unsigned-byte 8)

2 读取文件
(read-* stream eof-err-p eof-value)   读取流,如果err-p为真,则系统出错。如果err-p为假,则返回eof-value 
(read-char stream)    从流中读取一个字符
(read-line stream)    从流中读取一行
(read stream)         从流中读取一个S表达式,跳过注释和空格
(read-byte stream)    从二进制流中读取字节
(read-sequence seq stream)  读取并填充seq,返回填充的个数,可以通过:start :end指定填充范围

3 写文件
当以:output方式打开文件后,便可以使用各种write函数输出文件。
(write-char char stream)     向流中写一个字符
(write-line line stream)     向流中写一行并换行
(write-string string stream)   向流中写一串,无换行;使用terpri和fresh-line手工控制换行。
(write-byte byte stream)     向流写一字节
(write-sequence seq stream)  向流写一序列,序列必须是基于char的。

(write obj ... ostream)    输出对象,默认向标准输出写,下同
(print obj ostream)        输出S表达式
(prin1 obj ostream)
(princ obj ostream)
(pprint obj ostream) 

4 关闭文件
(close stream)        关闭流
打开关闭文件的操作如此频繁,以至于CL提供了with-open-file来封装open...close的操作。
(with-open-file (variable open-args*) body-form*)


5 路径名抽象
对于字符串表示的文件名,会存在操作系统的移植性问题。因而CL提供了pathname的抽象,可以用结构化的信息表示文件名。pathname有6个元素:host device dirctory name type version;每个元素都接受字符串值。其中目录元素是一个列表,包含:absolute或:relative前端。
(pathname "path") 构造一个路径名对象,其字面表示为#p"..."
(make-pathname :directory :name :type :defaults "path")

以下6个函数,分别访问路径名的各个元素:(pathname-host p)、(pathname-device p)、(pathname-directory pn)、(pathname-name p)、(pathname-type p)、pathname-version p)

以下函数,分别获取路径名各部分的字符串表示
(namestring pn)            获取路径名的字符串表示
(directory-namestring pn)  获取目录的字符串表示
(file-namestring pn)       获取文件的字符串表示

(merge-pathnames path1 path2)  合并为path2/path1,如果path2为是路径
(enough-namestring #p"/root/a/b"  #p"/root/a/")  从第一路径中去除第二路径

6 两种表示法
目录可以有两种表示法:文件法和目录法;在文件法中,最后一级目录作为name项存在,而在目录表示法中,所有目录均作为dirctory项存在。
当前make-pathname的实现均表示成文件法,除法路径最后一个字符是路径分隔符。

7 文件系统函数
(probe-file path)  若文件存在,则返回真实路径,否则返回NIL
(directory path)   返回path下文件列表,不同LISP的实现不大一样
(delete-file path)  删除一个文件
(rename-file old new)
(ensure-directory-exist path) 创建目录,path必须是目录形式,以分隔符结束
(file-write-date file)  返回更新时间戳
(file-author path)      返回文件属主
(file-length stream)    返回文件字节数
(file-position stream pos)  返回/或设置流当前位置


8 其他IO类型
make-string-input-stream   创建可供read*的stringstream
make-string-output-stream  创建可供write或print的stringstream,流中数据用get-output-stream-string

with-input-from-string  封装
with-output-to-string   封装

make-broadcast-stream 创建broadcast-stream
make-concatenated-stream

make-two-way-stream
make-echo-stream

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

相关推荐

Windows中的TLS 1.2启用方法(IIS、C#、.Net framework)

折腾几天了windows中的tls1.2启用方法!特此记录一下 开发背景: 在一个用.net framework 2.0开发的客户端程序里面嵌入功能调用第三方物联网相关接口,服务器上有一个restful接口用于接收第三方上报的数据及处理,最后再调用第三方的物联网相关接口。本机开发环境Windows 10,客户服务器是Windows Server 2008 R2。 第一次写这种物联网相关的接口调用,而且第三方提供的文档比较简单,最基本的报文示例都没。开发环境里面各种摸索一步一个坑,首先在发送HTTP请求前

dl1314ld的博客 1万+

Common Lisp语言快速入门

Lisp是软件领域的分裂力量。一方面,Lisp爱好者誓言Lisp比软件领域内的其它语言都更加快捷、整洁和强大;而反对者则辩称,不可靠的执行和库支持不足使得开发者难以在其中编写任何真正的软件。事实上,他们都有各自的道理。 第一版Lisp于大约50年前推出,这使得它和FORTRAN一样,成为现在仍在使用的最古老的编程语言之一。可以证明,它拥有(它们将会拥有)最 庞大的特性列表,它也是第一种包括一整套...

weixin_34405925的博客 292

Android Termux 安装Kali Linux 或 kali Nethunter史诗级详细教程

Termux 安装kali

风云小虾米的博客 6万+

Common Lisp 初学者快速入门指导

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

dreamli199的博客 9007

晶振(晶体振荡器)测试方法详解

晶振测试方法分为无源和有源两种类型。无源晶振(两脚)需用示波器测试波形,重点关注正弦波形状、200mV-1.5Vpp幅值和频率精度;有源晶振(四脚)通电后直接输出方波。测试要点包括:示波器使用10X探头、AC耦合,带宽需5倍于晶振频率;万用表可初筛短路/开路;替换法是工程最有效方法。常见故障排查顺序:供电→复位→焊接→型号→负载电容→波形观察→更换晶振→MCU配置。负载电容需按公式计算匹配,示波器观察是核心测试手段。

jiujiujinyuxi的博客 926

DEV-C++调试设置

       昨天用C/C++去考了CSP,结果用DEV-C++调试总是闪退,按照我的记忆打开了调试参数,迷迷糊糊搞了一通,还是没办法调试,难受了几个小时。所以今天痛下决心,一定要写下DEV-C++设置调试的过程,警示自己! 解决步骤 1.打开DevC++找到上方工具栏 2.点击选择编译选项,再按下图所示设置即可

懒羊羊的快乐小屋 1029

文件I/O

Common Lisp 为读写数据提供了一个流的抽象和一个称为路径名(pathname)的抽象,他们以一种跟操作系统无关的方式来管理文件 特有:读写S表达式 S基本元素是列表和原子(非列表或空列表),列表是括号包围,并且包含任意数量的以空格分开的元素。我们平常说的列表(1 2 3)就是一个S表达式。 一:读取文件数据 Open 基于字符的输入流,你可以将它传给函数以便读取一个或多个字符。你

ryuali2010的专栏 1622

【100%通过率】华为OD机试真题 Python 实现【打印机队列】【2022.11 Q4 新题】

有5台打印机打印文件,每台打印机有自己的待打印队列。因为打印的文件内容有轻重缓急之分,所以队列中的文件有1~10不同的代先级,其中数字越大优先级越高。打印机会从自己的待打印队列中选择优先级最高的文件来打印。如果存在两个优先级一样的文件,则选择最早进入队列的那个文件。现在请你来模拟这5台打印机的打印过程。

MISAYAONE的博客 1万+

目录抽象化实现(二)

为了让路径名足够抽象从而可以应用于广泛的文件系统。我们必须对多数跨越不同实现的常见操作提供一致接口。尽管你编写的代码都是“可移植的”,但是可能偶尔需要依赖于实现相关的功能或者为不同实现编写稍有差别的代码。Common lisp提供一种称为读取期条件化的机制,有条件的执行特性代码。 该机制由变量*feature* 和两个被lisp读取器所理解的附加语法构成(#+,#-) *feature*是个符

ryuali2010的专栏 696

uniapp [安卓苹果App端] - 详细实现手机蓝牙连接打印机及打印票据小票/标签/面单/热敏小票订单/快递单等通用兼容适配解决方案,Uniapp对接蓝牙打印机支持各种主流品牌及打印指令,强悍插件

uni-app,安卓Android,苹果ios,安卓app端,苹果App端,uniapp苹果app,蓝牙打印机,uniappAPP实现通过蓝牙连接打印机打印,uniapp蓝牙连接打印机,安卓蓝牙打印插件,蓝牙打印机,蓝牙ble低功率及高功率打印机小票、标签、面单打印,手机PDA蓝牙打印插件,连接蓝牙打印机,蓝牙连接,打印文本、图片、条码、二维码,兼容斑马打印机、佳博打印机,TSC打印机,免费蓝牙打印机组件,蓝牙打印条码,蓝牙打印机连接,热敏蓝牙打印机,便携式打印机,打印机搜索不到,连接失败,发送打印命令

🏆 前端领域优质创作者 1万+

药物相关 PK(药代动力) 、PD(药效)指标知识

PK代表药物的药代动力学,指的是药物在体内的吸收、分布、代谢和排泄等过程,包括药物的药代动力学参数如Cmax(最大血药浓度)、Tmax(最大血药浓度出现的时间)、t1/2(半衰期)、AUC(药物曲线下面积)等。PD代表药物的药效学,指的是药物与生物体相互作用所产生的药理效应,包括药物的药效学参数如EC50(半数最大有效浓度)、ED50(半数最大效应剂量)、Emax(最大效应)等。PD(Pharmacodynamics)则研究药物的药效学特性,如药物的作用机制、效力、最大疗效、最小毒性等。

weixin_42357472的博客 2万+

common lisp中获取当前文件路径

1,直接获取当前文件夹的路径: (print (probe-file ".") ) 2.或许打开文件的大小: (let ((file (open "hello.c" :if-does-not-exist nil))) (print (file-length file)) (close file) ) 3.获取打开文件中的内容 (let ((in (open "hello.c

亚马逊丛林 5433

华为OD机试真题 新系统2026-04-08 C++ 实现【直捣黄龙】

小王在玩一款叫做直捣黄龙的小游戏,在该游戏中他需要从入口位置进入敌营,绕过哨兵的层层封锁,达到敌军司令部实施斩首行动。 敌军阵营是一个n*n的矩阵,入口在坐标(0,n/2),敌军司令部在坐标(n-1,n/2),每个 哨兵警戒以自己为中心的9宫格,一旦被哨兵发现则行动失败。

MISAYAONE的博客 261

newlisp 获取文件名

newlisp对文件操作的支持有限,还是要自己做一些额外的工作。现在来获取linux下的文件名。输入是文件路径,返回文件名。;; get the file name without path (define (file-name file-full-path) (unless (file? file-full-path) (throw-error (append "file doesn't e

Dean Chen的专栏 3767

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

利用lisp进行AutoCAD二次开发(环境说明、文件读取、以及表格创建与写值)

今天的这个例子是lisp计算机语言编程,说到这门计算机语言还是大学的时候接触的,不过那时候都是停留在了解的层面上,后面编写AutoCAD二次开发程序几乎是用的是C#。所以对lisp不熟,就别提关于lisp在AutoCAD方面的接口。而今天所以又捡起这么计算机语言,是出于两方面原因,首先在AutoCAD明经测绘GIS板块中有相当一部分代码是lisp编写的,这部分代码非常实用于测绘GIS日常生产。另外...

yGIS 2万+

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

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

Common Lisp 超规范(译文):19.文件名

19 文件名 19.1 文件名概述 19.2 Pathnames 19.3 逻辑路径名 19.4 The Filenames Dictionary 19.1 文件名概述 这里有很多种文件系统, 在它们的表面语法细节, 以及它们的潜在的能力和结构上都有很大的不同. 由 Common Lisp 提供的用于引用和操作文件的工具被选择与许多类型的文件系统兼容, 同...

乐征skyline 543

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

COMMON LISP语言学习笔记(一)

知道lisp是偶然的,只是在浏览博客时,偶然看到关于lisp语言的介绍。是一篇评论,名字叫《LISP天才神话》。什么样的语言是天才使用的。     后来慢慢查看关于LISP的资料,才知道LISP是一种怎样的语言。具体我也不好说,只是有些理解,真要我说出个所以然来,也不能。有人说,到目前为止,真正干净利落,始终如一的编程模式只有两种:C语言模式和LISP语言模式。     LISP语言和C语言是

lwbkfc的专栏 952

Lisp语言入门教程

Lisp(LISt Processor)是一种函数式编程语言,以其强大的符号处理能力和独特的括号语法著称。它是最早的高级编程语言之一,广泛应用于人工智能、符号计算等领域。Lisp的核心数据结构是链表(List),代码和数据采用相同的表示形式,这种特性称为"同像性"。使用约定全局变量用*包围使用let(y 20))(+ x y));返回30使用defun(* x x))(square 5);返回25。

qeejhp889f的博客 551

Common Lisp 零基础入门:核心语法与思维方式

括号看前 → 参数看后 → 嵌套先内 → 列表多用 car/cdr → 函数优先括号 = 一个操作单元参数 = 列表里的输入嵌套 = 内层先算列表操作 =函数 = 逻辑打包。

pumpkin84514的博客 1090

获取指定目录下的文件夹名称

在 lambda 表达式中,`current` 表示当前目录的路径,`name` 表示当前文件或文件夹的名称。如果是目录,则返回 `true`,被 `list` 方法筛选出来,存储在 `subDirectories` 数组中。首先,我们使用 `File` 类创建一个表示指定目录的实例,该目录的路径由 `basePath + path` 指定。其中,`basePath` 是基础路径,`path` 是相对路径,两者组合起来表示要遍历的目录的完整路径。

yuzheh521的博客 419

检查文本路径下的文件是否为文本格式/二进制的文件

const path = require('path'); //使用node自带的内置终端 const textExtensions = require('text-extensions'); //一个文本类型库的插件,内置了各种文本的类型后缀 const extensions = new Set (textExtensions); //利用es6的去重对于文本的后缀进行校验返回判定 例如 [css,vue,json,js,ts] module.export=filePath => extension

weixin_52934055的博客 719

linux 无法打开共享对象文件: 没有那个文件或目录

1、首先排查对应的.so文件是否存在; 2、验证.so文件是否可以执行(ldd可以列出一个程序所需要得动态链接库),正常的话会列出链接库,否则会异常 ldd lib.test.so

IT打工匠 1万+

天正lisp文件夹_晓东CAD家园-论坛-A/VLISP-[求助]:怎样设置这个lisp里的读取文件路径-这时一个别人很久以前的lisp文件,可能是cadR12版就有了。文件语句如下:(setq pt...

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。您需要 登录 才可以下载或查看,没有帐号?立即注册x这时一个别人很久以前的lisp文件,可能是cadR12版就有了。文件语句如下:(setq pt (osnap (getpoint "\n捕捉一个点 :") "end,int"))(command "ucs" "o" pt)(setq f (open "/hcad/sld/J647.dat" ...

weixin_39693971的博客 562

Lisp语言:文件操作

作为一个基本功能,文件操作对于大多数语言来讲都是必须支持的,Lisp语言和大多数语言一样提供了文件操作接口。 在Lisp中对文件的操作通过函数open来实现,通过open函数打开一个文件,然后通过read函数读取文件内容,或者通过format函数将数据写入文件中。 函数open的第一个参数是目标文件的路径和文件名,然后是一些参数,包括: :direction用于指定文件打开后会执行的操作,缺省...

mmdev 2185
上一篇: Common Lisp学习之五:集合数据结构
下一篇: Common Lisp学习之七:LISP的面向对象编程
zzulp
博客等级 码龄19年 464粉丝 176原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值