Skip to content

Commit 1f5e48a

Browse files
committed
updates
1 parent 2944a5f commit 1f5e48a

File tree

8 files changed

+230
-117
lines changed

8 files changed

+230
-117
lines changed

Diff for: arglist.lsp

+13-13
Original file line numberDiff line numberDiff line change
@@ -7,47 +7,38 @@
77
;;
88
;; - [] (&optional)
99
;; - ... (&rest, args)
10-
;;
1110
;; - string, list, (array) -> seq, sequence
1211
;; - int-file, str-device -> device
13-
;; - int, float -> num (integer-only -> int)
12+
;; - int, float -> num
13+
;; - integer-only -> int
1414
;; - primitive, lambda, sym-function -> function
1515
;; - test-function -> predicate
1616
;; - exp -> obj, form
1717

1818
;; ChangeLog:
1919
;; v10.2.9 [+] net-ipv
2020
;; v10.2.8 [+] net-packet,
21-
;; [*] net-connect, get-url, post-url, put-url, delete-url
22-
;; net-service
21+
;; [*] net-connect, get-url, post-url, put-url, delete-url, net-service
2322
;; v10.2.1 [+] term, prefix, self, extend, read, write, ++, --
2423
;; [-] name
2524

2625
;; TODO:
2726
;; * FIXMEの見直し
2827
;; * http://www.newlisp.org/downloads/newlisp_manual.html#type_ids
2928
;; -> array,body,bool,context,exp,func,int,list,num,matrix,place,str,sym,sym-context
29+
;; * Win32システムで利用できない関数の扱い
3030

3131
;;; Code:
3232

3333
(new Tree 'Arglist) ; make hash-table
3434

35-
(define-macro (defargs fname lambda-list)
36-
(Arglist (string fname) lambda-list))
37-
3835
(define (subr-name f)
3936
(and (primitive? f)
4037
(let ((cell->aux
4138
;; see newlisp.c:printCell
4239
(lambda (x) (nth 3 (dump x)))))
4340
(get-string (cell->aux f)))))
4441

45-
;;;##interface
46-
(define-macro (arglist f)
47-
(let ((lst (arglist-1 (eval f))))
48-
(when lst
49-
(cons (sym f) lst))))
50-
5142
;(arglist cons) => (cons x y)
5243
;(arglist-1 cons) => (x y)
5344
(define (arglist-1 f)
@@ -59,6 +50,15 @@
5950
((context? f) (arglist-1 (default f)))
6051
("else" (Arglist (string f)))))
6152

53+
;;;##interface
54+
(define-macro (arglist f)
55+
(let ((lst (arglist-1 (or (eval f) f))))
56+
(when lst
57+
(cons (sym f) lst))))
58+
59+
(define-macro (defargs fname lambda-list)
60+
(Arglist (string fname) lambda-list))
61+
6262
(defargs ! (command))
6363
(defargs $ (index))
6464
(defargs + ([num ...]))

Diff for: argv.lsp

+10-6
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,10 @@
77
;; - 2010-01-21 初版作成
88
;; - 2010-10-04
99
;; なるべくnewlisp起動時の流れに沿うように修正
10-
;; (-startのような失敗する引数も許すようになった)
10+
;; ("-start" のような失敗する引数も許すようになった)
1111
;; オプション-t,-6の追加
12+
;; - 2011-01-29
13+
;; オプション-vの追加
1214

1315
;;; TODO
1416
;;
@@ -19,23 +21,24 @@
1921
(define invocation-name (first $main-args)) ; "newlisp" or "newlisp.exe"
2022
(define $argv (rest $main-args))
2123

24+
;; @syntax (argv index)
2225
(define (argv i)
2326
(cond (i (if (< i (length $argv)) ($argv i) nil))
2427
(true $argv)))
2528

26-
;; @syntax: (pop-args str value?)
29+
;; @syntax (pop-args str value?)
2730
(define (pop-args str (has-value nil))
2831
(let ((n (find str $argv
2932
(lambda (x y)
3033
(starts-with y x)))))
3134
(when n
3235
(cond
3336
((and has-value (= 2 (length (argv n)))) ; "-arg" "value"
34-
(if (empty? ((+ n 1) $argv))
35-
(throw-error (string "missing parameter for " (argv n))))
36-
(pop $argv (+ n 1))
37+
(if (empty? ((+ n 1) $argv))
38+
(write 2 (string "missing parameter for " (argv n) "\n")) ; XXX
39+
(pop $argv (+ n 1)))
3740
(pop $argv n))
38-
(true ; "-arg[value]"
41+
(true ; "-arg[value]"
3942
(pop $argv n))))
4043
nil))
4144

@@ -55,6 +58,7 @@
5558
(pop-args "-p" true)
5659
(pop-args "-d" true)
5760
(pop-args "-t" true)
61+
(pop-args "-v")
5862
(pop-args "-w" true)
5963
(pop-args "-6")
6064

Diff for: cl.lsp

+67-21
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,65 @@
11
;;; cl.lsp --- Common Lisp like functions
22

3+
;;; NOTE:
4+
;;
5+
;; see "Differences to Other LISPs"
6+
;; - http://www.newlisp.org/index.cgi?page=Differences_to_Other_LISPs
7+
;; * Case-sensitive
8+
;; * 関数部分は事前に評価される
9+
;; * LISP-1
10+
;; * ダイナミックスコープ
11+
;; * ドット対が存在しない
12+
;; * 関数引数はデフォルトでオプショナル
13+
;; * 存在しないシンボルは生成時にnilに束縛される
14+
;; * GCの代わりにORO
15+
;; * Fexprマクロは引数を評価しない
16+
;; * パッケージの代わりにコンテキスト
17+
;; * Implicit Indexing
18+
319
;; (constant (global 't) true)
20+
;; (define t true)
421
(define (null x) (not (true? x)))
5-
(define car first)
22+
;;(define car first)
23+
(define (car x)
24+
(if (member x '(nil ())) nil (first x)))
625
(define cdr rest)
726
(define defconstant
827
(lambda-macro ()
928
(constant (args 0) (eval (args 1)))))
1029
(define export global)
1130
(define progn begin)
1231
(define (funcall f) (apply f (args)))
32+
(define (atom obj)
33+
(or (atom? obj)
34+
(= obj '())))
35+
(define eq =)
36+
(define eql =)
37+
(define equal =)
1338
(define let* letn)
1439
(define intern sym) ; or make-symbol
15-
(define symbol-name name)
40+
(define symbol-name term)
41+
(define symbol-package prefix)
1642
(define char-code char) ; (char "A") => 65
1743
(define code-char char) ; (char 65) => "A"
1844
(define rplaca ; (rplaca x y)
1945
(lambda-macro ()
2046
(setf (first (eval (args 0))) (eval (args 1)))
2147
(eval (args 0))))
22-
(define rotatef swap)
48+
(define rotatef swap) ; swap accept only two variables
2349
(define complement
2450
(lambda-macro ()
2551
(letex ((f (args 0)))
2652
(lambda ()
2753
(not (apply f (args)))))))
2854
(define identity
29-
;; なんでマクロにしたんだっけ?
30-
(lambda-macro ()
31-
(eval (args 0))))
55+
;; 引数のコピーを避けるためマクロを利用している
56+
(lambda-macro () (eval (args 0))))
57+
58+
;; FIXME: short `uuid' name is safe to use?
59+
(define (gensym) (sym (append "g-" (slice (uuid) 0 8))))
3260

3361
(define (find-symbol str (ctx (context)))
62+
;; or (context ctx str)
3463
(sym str ctx nil))
3564

3665
(define read-from-string read-expr)
@@ -39,11 +68,12 @@
3968
(constant 'most-positive-fixnum 0x7fffffffffffffff)
4069
(constant 'most-negative-fixnum 0x8000000000000000)
4170
(defconstant pi (mul (atan 1) 4)) ; 3.141592654 (mul (acos 0) 2)
42-
(define equal =)
43-
(define incf inc)
44-
(define decf dec)
71+
(define incf inc) ; or ++
72+
(define decf dec) ; or --
4573
(define (plusp number) (< 0 number)) ; or (> number) , (sgn number nil nil true)
4674
(define (minusp number) (< number 0)) ; or (< number) , (sgn number true nil nil)
75+
(define (evenp i) (= (& i 1) 0))
76+
(define (oddp i) (= (& i 1) 1))
4777
(define (ash i cnt) (sgn cnt (>> i (abs cnt)) i (<< i cnt)))
4878
(define logand &)
4979
(define logxor ^)
@@ -65,7 +95,11 @@
6595
((- n) lst))
6696
(define every for-all)
6797
(define (some f lst)
98+
(if (symbol? f) (setq f (eval f)))
6899
(dolist (obj lst (f obj))))
100+
(define (notany f lst)
101+
(setq f (eval f))
102+
(not (apply exists (list f lst $args))))
69103
(define position find)
70104
(define find-if exists)
71105
(define remove-duplicates unique)
@@ -95,6 +129,13 @@
95129
;; (map list '(1 2 3 4) '(10 nil 30) '(100 200 300 400 500 600))
96130
;; => ((1 10 100) (2 nil 200) (3 30 300) (4 nil 400))
97131

132+
(define (list* )
133+
(cond ((empty? (rest (args)))
134+
(first (args)))
135+
(true
136+
(cons (first (args))
137+
(apply list* (rest (args)))))))
138+
98139
;;; @@sequence
99140
;(define concat string)
100141
(define (concat) (join (args)))
@@ -107,12 +148,8 @@
107148
(cond (end (slice seq start (- end start)))
108149
(true (slice seq start))))
109150

110-
(define (string-equal string1 string2)
111-
"Compare two strings ignore case."
112-
(let ((PCRE_CASELESS 1))
113-
(list? (regex (string "^" (regex-quote string1) "$")
114-
string2
115-
PCRE_CASELESS))))
151+
(define (string-equal str1 str2)
152+
(= (upper-case str1) (upper-case str2)))
116153

117154
(define (string-left-trim char-bag str)
118155
(if (string? char-bag)
@@ -133,16 +170,12 @@
133170
(define (string-trim char-bag str)
134171
(string-right-trim char-bag (string-left-trim char-bag str)))
135172

136-
;; (define (string-trim char-bag str) (trim str char-bag char-bag))
137-
;; (define (string-left-trim char-bag str) (trim str char-bag ""))
138-
;; (define (string-right-trim char-bag str) (trim str "" char-bag))
139-
140173
(define-macro (ignore-errors form)
141174
(eval-string (prin1-to-string form) (context) nil))
142175

143176
;; @syntax (unwind-protect protected-form cleanup-form*) => result
144177
;; (context 'unwind-protect)
145-
(letex ((result (sym (uuid))))
178+
(letex ((result (gensym)))
146179
(define-macro (unwind-protect )
147180
(local (result)
148181
(if (catch (eval (args 0)) 'result)
@@ -151,8 +184,21 @@
151184
)
152185

153186
(define (prin1-to-string obj)
154-
(cond ((string? obj) (format"\"%s\"" (replace "\\" obj "\\\\")))
187+
(cond ((string? obj) (format {"%s"} (replace "\\" obj "\\\\")))
155188
("else" (string obj))))
156189

190+
;; parallel setq
191+
;; @syntax (psetq var form ...)
192+
(define psetq
193+
(letex ((v (gensym))
194+
(s (gensym)))
195+
(lambda-macro ()
196+
(unless (= (& (length $args) 1) 0)
197+
(throw-error "missing argument"))
198+
(dolist (v (map (lambda (s) (list (s 0) (eval (s 1))))
199+
;; ((var1 val1) (var2 val2) ...)
200+
(explode $args 2)))
201+
(set (v 0) (v 1))))))
202+
157203
(context MAIN)
158204
;;; EOF

Diff for: files.lsp renamed to filesys.lsp

+41-5
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
;; files.lsp --- Fileystem Utilities
1+
;; filesys.lsp --- Fileystem Utilities
22

33
;; NOTE: Linuxでは存在しないファイルにrealpathを使えない
44
(define (merge-pathnames pathname (defaults "."))
@@ -24,11 +24,46 @@
2424
(or (probe-file pathname)
2525
(error "%s: No such file or directory" pathname)))
2626

27+
;; FIXME: "/"
28+
;; (define (basename path (sfx ""))
29+
;; (if (= (path -1) "/")
30+
;; (setq path (chop path)))
31+
;; (catch
32+
;; (for (idx 1 (length path))
33+
;; (when (= (path (- idx)) "/")
34+
;; (setq path ((- 1 idx) path))
35+
;; (throw 'found))))
36+
;; (if (ends-with path sfx)
37+
;; (setq path (chop path (length sfx))))
38+
;; path)
39+
2740
(define (basename path (sfx ""))
28-
(if (= path "")
29-
path
30-
(string-right-trim sfx
31-
(last (parse path "[\\/]" 0)))))
41+
(if (= (path -1) "/")
42+
(setq path (chop path)))
43+
(setq path (last (or (parse path "[\\/]" 0) '("/"))))
44+
(if (ends-with path sfx)
45+
(setq path (chop path (length sfx))))
46+
path)
47+
48+
;; "/usr/lib" => "/usr"
49+
;; "/usr/" => "/"
50+
;; "usr" => "."
51+
;; "/" => "/"
52+
;; "." => "."
53+
;; ".." => "."
54+
(define (dirname path)
55+
(if (and (find (path -1) "/\\")
56+
(!= "/" path))
57+
(setq path (chop path)))
58+
(catch
59+
(begin
60+
(for (idx 1 (length path))
61+
(when (find (path (- idx)) "/\\")
62+
(setq path (chop path idx))
63+
(throw 'found)))
64+
(setq path ".")))
65+
(cond ((empty? path) "/")
66+
(true path)))
3267

3368
(define (file-length pathname)
3469
"Retun PATHNAMEs file size as byte."
@@ -66,5 +101,6 @@
66101
;; FIXME: s/mktemp/mkstemp
67102
(define mktemp make-temp-file-name)
68103

104+
69105
(context MAIN)
70106
;;; EOF

0 commit comments

Comments
 (0)