scheme I/0 输入输出操作
2.1. open-input-file, read-char, and eof-object?
The function (open-input-file filename) is available to open a file. This function return a port for input. The function (read-char port) is to read a character from the port. As this function returns eof-object when it reaches the end of the file (EOF), you can check it by using eof-object?. The function (close-input-port port) is to close the input port. The [code 1] shows a function that returns file contents as string.
[code 1]
(define (read-file file-name)
(let ((p (open-input-file file-name)))
(let loop((ls1 '()) (c (read-char p)))
(if (eof-object? c)
(begin
(close-input-port p)
(list->string (reverse ls1)))
(loop (cons c ls1) (read-char p))))))
为什么要reverse,因为cons c ls1 是把先前读取的放在后面,而c放在前面,为什么不(cons ls1 c)
#\!)
> (define c (cons 1 2))
> (cons c 3)
'((1 . 2) . 3)
> (cons 3 c)
'(3 1 . 2)
把cons放在car位置上,会有一个(),而放在第二个则没有。
For instance, the result shown in [example 1] is obtained by applying the [code 1] to a file [hello.txt]. As the newline character is represented by '\n', it is not easy to read. Function display is available, however, for formatting ([example 2]).
[hello.txt]
Hello world!
Scheme is an elegant programming language.
[example 1]
(cd "C:\\doc")
(read-file "hello.txt")
;Value 14: "Hello world!\nScheme is an elegant programming language.\n"
[example 2]
(display (read-file "hello.txt"))
Hello world!
Scheme is an elegant programming language.
;Unspecified return value
2.2. Syntaxes call-with-input-file and with-input-from-file
You can open a file for input using the syntax call-with-input-file or with-input-from-file. These syntaxes are convenient because they handle errors.
- (call-with-input-file filename procedure)
- It opens a file named filename for input. The procedure is a function that takes input port as an argument. The file should be closed explicitly because it is not closed when the control is returned from the procedure if the input port is potentially used again. The [code 1] can be rewritten like [code 2] using call-with-input-file.
-
它打开一个文件来作为输入,接受一个函数(port做为参数)
[code 2]
(define (read-file file-name)
(call-with-input-file file-name
(lambda (p)
(let loop((ls1 '()) (c (read-char p)))
(if (eof-object? c)
(begin
(close-input-port p)
(list->string (reverse ls1)))
(loop (cons c ls1) (read-char p))))))) - (with-input-from-file filename procedure) 自动关闭
- It opens a file named filename as the standard input. The procedure is a function with no argument. The file is closed when the control is returned from the procedure. [code 3] shows the rewritten function of [code 1] using with-input-from-file.
[code 3]
(define (read-file file-name)
(with-input-from-file file-name
(lambda ()
(let loop((ls1 '()) (c (read-char)))
(if (eof-object? c)
(list->string (reverse ls1))
(loop (cons c ls1) (read-char)))))))
2.3. read
The function (read port) reads a S-expression from the port. It is convenient to read contents with parentheses like [paren.txt]. (这个真是为lisp专门设计的。
[paren.txt]
'(Hello world!
Scheme is an elegant programming language.) '(Lisp is a programming language ready to evolve.)
[code 4]
(define (s-read file-name)
(with-input-from-file file-name
(lambda ()
(let loop ((ls1 '()) (s (read)))
(if (eof-object? s)
(reverse ls1)
(loop (cons s ls1) (read)))))))
The following shows the result of reading paren.txt by s-read.
(s-read "paren.txt")
⇒ ((quote (hello world! scheme is an elegant programming language.))
(quote (lisp is a programming language ready to evolve.)))
demo1:
'(hello wrodl)
'(you )
'(can)
输出:'('(hello wrodl) '(you) '(can))
demo2:
(you) (can)
'((you) (can))
demo3:
(you (we)) (can)
输出:'((you (we)) (can))
Exercise 1
Write the function read-lines that returns a list of strings which correspond to each line of file contents. The newline character is represented by#\Linefeed in Scheme. Following is the result of applying this function to the hello.txt.
(read-lines "hello.txt") ⇒ ("Hello world!" "Scheme is an elegant programming language.")
3. Output to files
3.1. Making a Port for output
Similar functions to those for input are available to make output ports.
- (open-output-file filename)
- It opens a file for output and returns a output port.
- (close-output-port port)
- It closes the port for output.
- (call-with-output-file filename procedure)
- It opens a file named filename for output and calls procedure. The function procedure takes the port as an argument.
- (with-output-to-file filename procedure)
- It opens a file named filename as the standard output and calls procedure. The procedure is a function with no argument. The file is closed when the control is returned from the procedure.
3.1. Functions for output
Following functions for output are available. These functions output to the standard output if the port is omitted.
- (write obj port)
- It outputs the obj to the port. Strings are enclosed in double quotes and characters are combined with the #\.
- (display obj port)
- It outputs the obj to the port. Strings are not enclosed in double quotes and characters are not combined with the #\.
- (newline port)
- It begins a new line.
- (write-char char port)
- It outputs the char to the port.
- 转自:http://www.shido.info/lisp/scheme9_e.html
- read-char 过程读取指定端口下一个字符;
- read-line 过程读取指定端口的下一行,返回一个字符串<换行符会自动去掉>;
- read 过程读取指定端口的下一个符号表达式。
- write-char 过程把一个字符<不带 #\>写入到指定端口;
- write 过程把一个符号表达式以一种 machine-readable 的形式写入指定端口,比如,一个字符串会被双引号括着,而字符会带有 #\;
- display 过程把一个符号表达式以一种 human-readable 的形式写入指定端口,比如,一个字符串不会被双引号括着,而一个字符不会带有 #\。
1
2
3
|
scheme@(guile-user) > (display 9) 9scheme@(guile-user) > (display 9 (current-output-port)) 9scheme@(guile-user) > |
- open-input-file 以一个文件名为参数,返回与这个文件相关联的输入端口,当所给文件不存在时会报错;
- open-output-file 以一个文件名为参数,返回与这个文件相关联的输出端口,当所给文件已存在时会报错。
scheme@(guile-user)> (define i (open-input-file "hello.txt"))
scheme@(guile-user)> (read-char i)
#\h
scheme@(guile-user)> (define j (read i))
scheme@(guile-user)> j
ello
scheme@(guile-user)> (read-char i)
#\newline
scheme@(guile-user)> (read-char i)
#<eof>
1
2
3
4
5
6
|
scheme@(guile-user) > (define o (open-output-file "greeting.txt" )) scheme@(guile-user) > (display "hello" o) scheme@(guile-user) > (write-char #\space o) scheme@(guile-user) > (display 'world o) scheme@(guile-user) > (newline o) scheme@(guile-user) > (close-output-port o) |
scheme@(guile-user) > (call-with-input-file "hello.txt" ... ( lambda (i) ... ( let * ((a (read-char i)) ... (b (read-char i)) ... (c (read-char i))) ... ( list a b c)))) (#\h #\e #\l) |
scheme@(guile-user) > (define i (open-input-string "hello world" )) scheme@(guile-user) > (read-char i) #\h scheme@(guile-user) > (read i) ello scheme@(guile-user) > (read i) world scheme@(guile-user) > (read i) # < eof > |
参考:
http://www.shido.info/lisp/scheme9_e.html
http://www.ccs.neu.edu/home/dorai/t-y-scheme/t-y-scheme-Z-H-9.html
http://lispor.is-programmer.com/posts/23271.html
scheme I/0 输入输出操作的更多相关文章
- 24小时学通Linux内核之如何处理输入输出操作
真的是悲喜交加呀,本来这个寒假早上8点都去练车,两个小时之后再来实验室陪伴Linux内核,但是今天教练说没名额考试了,好纠结,不过想想就可以睡懒觉了,哈哈,自从大三寒假以来还没睡过懒觉呢,现在也有更多 ...
- 十天学Linux内核之第四天---如何处理输入输出操作
原文:十天学Linux内核之第四天---如何处理输入输出操作 真的是悲喜交加呀,本来这个寒假早上8点都去练车,两个小时之后再来实验室陪伴Linux内核,但是今天教练说没名额考试了,好纠结,不过想想就可 ...
- Eclipse中通过Android模拟器调用OpenGL ES2.0函数操作步骤
原文地址: Eclipse中通过Android模拟器调用OpenGL ES2.0函数操作步骤 - 网络资源是无限的 - 博客频道 - CSDN.NET http://blog.csdn.net/fen ...
- Ubuntu14.04 64位机上安装OpenCV2.4.13(CUDA8.0)版操作步骤
Ubuntu14.04 64位机上安装CUDA8.0的操作步骤可以参考http://blog.csdn.net/fengbingchun/article/details/53840684,这里是在已经 ...
- unix的输入输出操作
unix的输入输出操作 使用的头文件 #include <unistd.h> #include <stdio.h> 函数说明 ssize_t read(int fd, void ...
- ThinkPHP5.0框架开发--第7章 TP5.0数据库操作
ThinkPHP5.0框架开发--第7章 TP5.0数据库操作 第7章 TP5.0数据库操作 ===================================================== ...
- moloch1.8.0简单操作手册
moloch1.8.0简单操作手册 Sessions 页面:Sessions主要通过非常简单的查询语言来构建表达式追溯数据流量,以便分析. SPIView 页面: SPIGraph页面:SPIGrap ...
- mysql8.0.16操作记录
mysql8.0.16操作记录 2.1.登录 -uroot -p'AnvcTMagdLarwNV3CKaC' mysql: [Warning] Using a password on the comm ...
- Lua I/0输入输出
I/O库为文件操作提供了两种不同的模型,简单模型和完整模型.简单模型假设一个当前输入文件和一个当前输出文件,他的I/O操作均作用于这些文件.完整模型则使用显式的文件句柄,并将所有的操作定义为文件句柄上 ...
随机推荐
- Static用法
一.Static全局变量和全局变量的区别 1)全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量.全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式. 这两者在存储 ...
- Android使用bindService启动服务
1.Service package com.example.ebobo; import java.util.Timer; import java.util.TimerTask; import andr ...
- android中的本地定时推送到通知栏
一.使用系统定义的Notification 以下是使用示例代码: import android.app.Notification; import android.app.NotificationMan ...
- hdu 5248 序列变换(二分枚举)
Problem Description 给定序列A={A1,A2,...,An}, 要求改变序列A中的某些元素,形成一个严格单调的序列B(严格单调的定义为:Bi<Bi+,≤i<N). 我们 ...
- ubuntu下安装Apache+PHP+Mysql(转)
转载自:http://www.comflag.com/2011/05/01/apache-web.htm 步骤一,安装apache2 1 sudo apt-get install apache2 安装 ...
- jQuery Pagination Ajax分页插件中文详解(摘)
jQuery Pagination Ajax分页插件中文详解 by zhangxinxu from http://www.zhangxinxu.com 本文地址:http://www.zhangxin ...
- Git的一些用法(建立新的branch)
建立新的branch和查看全部的branch(kk的代码是基于现有的branch) 切换到branch kk: 当然我们也能够在android studio里操作: 注意切换的时候代码会丢失,必须先c ...
- Swift——(一)为Swift内置类型加入属性
在看苹果官方的Swift Language的时候,遇到实验:Write an extension for the Double type that add an absoluteValue prope ...
- Oracle监听静态注册和动态注册
静态注册和动态注册总结 一.什么是注册? 注册就是将数据库作为一个服务注册到监听程序.客户端不需要知道数据库名和实例名,只需要知道该数据库对外提供的服务名就可以申请连接到数据库.这个服务名可能与实例名 ...
- 前端--关于CSS
CSS全名层叠样式表,层叠的含义有三个:1.按照特殊性的高低,特殊性高的覆盖特殊性低的样式声明:2.不同属性的样式声明要合并:3.后出现的相同的样式声明覆盖先出现的.所以要改变样式的优先级也有三种方法 ...