home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DOS/V Power Report 1999 April
/
VPR9904A.BIN
/
Vpr_data
/
Special
/
Yoolw101
/
Yoolw101.lzh
/
AUTO.YO
next >
Wrap
Lisp/Scheme
|
1998-09-19
|
5KB
|
252 lines
;
;(defun string (arg1 arg2) (・・・・・))
; expr関数定義
(df 'defun '(lambda(func_def)
(eval (list 'de (list 'quote (car func_def)) (list 'quote (append (list 'lambda (cadr func_def)) (cddr func_def)))))
))
;
;(strrep string org new) string,org,new:string
; 文字列stringの中のorgをnewに置き換える。
;
(de 'strrep '(lambda(x y z)(prog()
;無限ループにならないように
(if (not (null (strpos y z)))
(return (prog()
(print "この組み合わせでは、置換出来ません!")
(return x)
))
)
(loop(num)
(setq num (strpos x y))
(cond
((null num)(return x))
((eq num 1)
(setq x (concat z (substr x (plus num (strlng y)) (strlng x))))
)
((eq (plus (sub1 num) (strlng y)) (strlng x))
(setq x (concat (substr x 1 (sub1 num)) z))
)
(t
(setq x (concat (substr x 1 (sub1 num)) z (substr x (plus num (strlng y)) (strlng x))))
)
)
)
)))
;
;(expand arg_list fn) arg_list:list fn:atom
; マクロ関数で、2引数の関数を多引数にするのに使う。
;
(de 'expand '(lambda(x y)(cond
((null x) nil)
(t (list y (car x) (expand (cdr x) y)))
)))
;
;(allappend arg1 arg2 ・・・ argn) argn:list
; 総てのリストをつなげる。(append)
;
(dm 'allappend '(lambda(x)(expand (cdr x) 'append)))
;
;(allnconc arg1 arg2 ・・・ argn) argn:list
; 総てのリストをつなげる。(nconc)
;
(dm 'allnconc '(lambda(x)(expand (cdr x) 'nconc)))
;
;(sort x) x:list
; リストの数字を小さい物から順に並べ換える。(クイックソート)
;
(de 'sort '(lambda(x)(prog(pre med post comp)
(cond
((null x) (return x))
((null (cdr x)) (return x))
)
(setq comp (car x))
(setq med (cons comp nil))
(setq x (cdr x))
(loop(w)
(setq w (car x))
(cond
((lessp w comp) (setq pre (cons w pre)))
((eq w comp) (setq med (cons w med)))
(t (setq post (cons w post)))
)
(setq x (cdr x))
(cond
((null x)(return t))
)
)
(return (allappend
(sort pre)
med
(sort post)
))
)))
;
;(strsort x) x:list
; リストの文字列を小さい物から順に並べ換える。
;
(de 'strsort '(lambda(x)(prog(pre med post comp)
(cond
((null x) (return x))
((null (cdr x)) (return x))
)
(setq comp (car x))
(setq med (cons comp nil))
(setq x (cdr x))
(loop(w)
(setq w (car x))
(cond
((strlessp w comp) (setq pre (cons w pre)))
((equal w comp) (setq med (cons w med)))
(t (setq post (cons w post)))
)
(setq x (cdr x))
(cond
((null x)(return t))
)
)
(return (allappend
(strsort pre)
med
(strsort post)
))
)))
(de 'strlessp '(lambda(x y)(prog()
(cond ((equal x y) (return nil)))
(loop()
(cond
((lessp (ascii x) (ascii y)) (return t))
((greaterp (ascii x) (ascii y)) (return nil))
)
(cond
((eq (strlng x) 1) (return t))
((eq (strlng y) 1) (return nil))
)
(setq x (substr x 2 (strlng x)))
(setq y (substr y 2 (strlng y)))
)
)))
(de 'strgreaterp '(lambda(x y)(prog()
(cond ((equal x y) (return nil)))
(loop()
(cond
((lessp (ascii x) (ascii y)) (return nil))
((greaterp (ascii x) (ascii y)) (return t))
)
(cond
((eq (strlng x) 1) (return nil))
((eq (strlng y) 1) (return t))
)
(setq x (substr x 2 (strlng x)))
(setq y (substr y 2 (strlng y)))
)
)))
;
;(gcm num1 num2) num1,num2:number
; 2つの数字の最大公約数を求める。
;
(de 'gcm '(lambda(num1 num2)(prog()
(cond
((greaterp num2 num1)(prog(x)
(setq x num1)
(setq num1 num2)
(setq num2 x)
))
)
(return (cond
((zerop (remainder num1 num2)) num2)
(t (gcm num2 (remainder num1 num2)))
))
)))
;
;(lcm num1 num2) num1,num2:number
; 2つの数字の最小公倍数を求める。
;
(de 'lcm '(lambda(num1 num2)(times num1 (car (divide num2 (gcm num1 num2))))))
;
;(hex hex_string) hex_string:string
; 16進ー>10進変換
;
(de 'hex '(lambda(x)(prog(first num)
(setq num 0)
(loop()
(setq first (ascii x))
(cond
(
(and
(lessp (sub1 (ascii "0")) first)
(lessp first (add1 (ascii "9")))
)
(setq num (plus (times num 16) (difference first (ascii "0"))))
)
(
(and
(lessp (sub1 (ascii "A")) first)
(lessp first (add1 (ascii "F")))
)
(setq num (plus (times num 16) (difference first (ascii "A")) 10))
)
(
(and
(lessp (sub1 (ascii "a")) first)
(lessp first (add1 (ascii "f")))
)
(setq num (plus (times num 16) (difference first (ascii "a")) 10))
)
(t (return num))
)
(cond
((eq (strlng x) 1) (return num))
)
(setq x (substr x 2 (strlng x)))
)
)))
;
;(\dir)
; ソートしてファイル名の一覧を表示する
;
(de '\dir '(lambda()(mapc 'print (strsort (dir "*.*")))))
;(de '\dir '(lambda()(strsort (dir "*.*"))))
;
;(\type str) str:string(file name)
; ファイルの内容を表示
;
(de '\type '(lambda(x)(prog(fp)
(setq fp (openr x))
(loop(sdata)
(setq sdata (freads fp))
(cond
((null sdata) (return nil))
)
(print sdata)
)
(close fp)
)))
;
;(\copy str1 str2) str1:string(org file) str2:string(new file)
; ファイルのコピー(複写)
; テキストファイルでもバイナリファイルでも可能
;
(de '\copy '(lambda(x y)(prog(fp1 fp2)
(cond
((not (stringp x)) (return nil))
((not (stringp y)) (return nil))
)
(setq fp1 (openr x))
(setq fp2 (openw y))
(loop(sdata)
(setq sdata (freadc fp1))
(cond
((null sdata) (return nil))
)
(fwritec fp2 sdata)
)
(close fp1)
(close fp2)
)))