Skip to content

Commit 2128690

Browse files
authored
Merge pull request #33 from yuhuoyingxiongniao/add-scanf
Add scanf feature to scheme-lib
2 parents a336022 + a14a4c0 commit 2128690

2 files changed

Lines changed: 38 additions & 0 deletions

File tree

docs/第三章 输入输出/3.1 输入输出.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,16 @@
11
# 1 输入
22

3+
读取一个输入
34
```scheme
45
(read)
56
```
67

8+
读取一行输入,按格式标记符分配到变量中,和C++的scanf功能类似,目前支持~s 和~d标记
9+
```scheme
10+
(define h 0)
11+
(scanf "/~s:" h)
12+
```
13+
714
# 2 输出
815

916
```scheme

packages/io/scanf.ss

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2+
;;Copyright 2016-2080 evilbinary.
3+
;;作者:evilbinary on 12/24/16.
4+
;;邮箱:rootdebug@163.com
5+
;;其中 scanf 由 yupengkun 友情贡献
6+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
7+
(library (io scanf)
8+
(export
9+
scanf)
10+
(import (scheme))
11+
(define (scanf fmt . var)
12+
(define (sf-f c str)
13+
(do ([n 0 (+ 1 n)]) ((equal? c (string-ref str n)) n)))
14+
(define c (list #\d string->number #\s eval))
15+
(set! fmt (string-append fmt "\r"))
16+
(let foo ([i 0] [tar (get-line (current-input-port))])
17+
(when (<= (+ i 3) (string-length fmt))
18+
(let ([f (string-ref fmt i)]
19+
[m (string-ref fmt (+ i 1))]
20+
[l (string-ref fmt (+ i 2))])
21+
(cond
22+
[(and (eq? f #\~) (or (eq? m #\d) (eq? m #\s)))
23+
(set! temp (+ (sf-f l tar) 1))
24+
(set-box!
25+
(car var)
26+
((cadr (memv m c)) (substring tar 0 (- temp 1))))
27+
(set! var (cdr var))
28+
(foo (+ i 3) (substring tar temp (string-length tar)))]
29+
[else
30+
(foo (+ 1 i) (substring tar 1 (string-length tar)))])))))
31+
)

0 commit comments

Comments
 (0)