開発環境
- macOS Sierra - Apple (OS)
- Emacs (Text Editor)
- C, Scheme (プログラミング言語)
- Clang/LLVM (コンパイラ, Xcode - Apple)
- 参考書籍等
Cを高級アセンブラーとした、Scheme の コンパイラー(ksc)、インタプリター(ksi)の作成で、標準ライブラリの char ライブラリの手続きのを実装。
今後、標準ライブラリの手続きはとりあえず合成手続きで実装して(compound_procedures.scm)、その後、速度向上の為に基本手続き(primitive_procedures.scm とC言語側)として実装していくことに。(ということで、現段階ではどの手続きも(凄く)遅い。)
コード
ksi.scm
(begin
;;
(define (primitive-procedure? proc) (tagged-list? proc 'primitive))
(define (primitive-implementation proc) (cdr proc))
(load "./lib/stdlib/base/primitive_procedures.scm")
(load "./lib/stdlib/char/primitive_procedures.scm")
(define primitive-procedures
(list ;; char
(c-cons 'char-alphabetic? char-alphabetic?)
(c-cons 'char-ci<=? char-ci<=?)
(c-cons 'char-ci<? char-ci<?)
(c-cons 'char-ci=? char-ci=?)
(c-cons 'char-ci>=? char-ci>=?)
(c-cons 'char-ci>? char-ci>?)
(c-cons 'char-downcase char-downcase)
(c-cons 'char-foldcase char-foldcase)
(c-cons 'char-lower-case? char-lower-case?)
(c-cons 'char-numeric? char-numeric?)
(c-cons 'char-upcase char-upcase)
(c-cons 'char-upper-case? char-upper-case?)
(c-cons 'char-whitespace? char-whitespace?)
(c-cons 'digit-value digit-value)
))
(define (map proc list)
(if (c-null? list)
'()
(c-cons (proc (car list))
(map proc (cdr list)))))
(define (primitive-procedure-names) (map car primitive-procedures))
(define (primitive-procedure-objects)
(map (lambda (proc)
(cons 'primitive (cdr proc)))
primitive-procedures))
(define (setup-environment)
((lambda (initial-env)
(define-variable! 'quote quote initial-env)
(define-variable! 'lambda lambda initial-env)
(define-variable! 'define define initial-env)
(define-variable! 'set! set! initial-env)
(define-variable! 'if if initial-env)
(define-variable! 'begin begin initial-env)
(define-variable! 'and and initial-env)
(define-variable! 'or or initial-env)
(define-variable! 'load load initial-env)
initial-env)
(extend-environment
(primitive-procedure-names)
(primitive-procedure-objects)
the-empty-environment)))
(define the-global-environment (setup-environment))
(define input-prompt "> ")
(define output-prompt "=> ")
(define input-port (current-input-port))
(define output-port (current-output-port))
(define (driver-loop)
(prompt-for-input input-prompt)
((lambda (input)
((lambda (output)
(announce-output output-prompt)
(user-print output))
(eval input the-global-environment)))
(read input-port))
(driver-loop))
(define (prompt-for-input string)
(display string output-port))
(define (announce-output string)
(display string output-port))
(define (user-print object)
(if (error-object? object)
(begin
(display "Error: ")
(if (not (eq? (error-object-message object)) '||)
(display " "))
(display (error-object-message object))
(define (iter objs)
(if (not (c-null? objs))
(begin (display " ")
(write (car objs))
(iter (cdr objs)))))
(iter (error-irritants object)))
(if (primitive-procedure? object)
(display '|#<primitive-procedure>| output-port)
(if (compound-procedure? object)
(begin (display '|#<compound-procedure | output-port)
(write (procedure-parameters object) output-port)
(write '> output-port))
(write object output-port))))
(newline output-port))
(eval '(begin
(load "./lib/stdlib/base/compound_procedures.scm")
(load "./lib/stdlib/char/compound_procedures.scm"))
the-global-environment)
(driver-loop)
)
lib/stdlib/char/primitive_procedures.scm
(begin
(define (char-alphabetic? . args)
(if (c-= (c-length args) 1)
(if (c-char? (c-car args))
(c-char-alphabetic? (c-car args))
(error '|(char-alphabetic?) wrong type of argument --| args))
(error '|(char-alphabetic?) wrong number of arguments --| args)))
(define (char-ci<=? . args)
(if (c-< 1 (c-length args))
(begin
(define (iter char chars)
(if (c-null? chars)
#t
(if (c-char? (c-car chars))
(if (c-char-ci<=? char (c-car chars))
(iter (c-car chars) (c-cdr chars))
#f)
(error '|(char-ci<=?) wrong type of argument --| args))))
(if (c-char? (c-car args))
(iter (c-car args) (c-cdr args))
(error '|(char-ci<=?) wrong type of argument --| args)))
(error '|(char-ci<=?) wrong number of arguments --| args)))
(define (char-ci<? . args)
(if (c-< 1 (c-length args))
(begin
(define (iter char chars)
(if (c-null? chars)
#t
(if (c-char? (c-car chars))
(if (c-char-ci<? char (c-car chars))
(iter (c-car chars) (c-cdr chars))
#f)
(error '|(char-ci<?) wrong type of argument --| args))))
(if (c-char? (c-car args))
(iter (c-car args) (c-cdr args))
(error '|(char-ci<?) wrong type of argument --| args)))
(error '|(char-ci<?) wrong number of arguments --| args)))
(define (char-ci=? . args)
(if (c-< 1 (c-length args))
(begin
(define (iter char chars)
(if (c-null? chars)
#t
(if (c-char? (c-car chars))
(if (c-char-ci=? char (c-car chars))
(iter (c-car chars) (c-cdr chars))
#f)
(error '|(char-ci=?) wrong type of argument --| args))))
(if (c-char? (c-car args))
(iter (c-car args) (c-cdr args))
(error '|(char-ci=?) wrong type of argument --| args)))
(error '|(char-ci=?) wrong number of arguments --| args)))
(define (char-ci>=? . args)
(if (c-< 1 (c-length args))
(begin
(define (iter char chars)
(if (c-null? chars)
#t
(if (c-char? (c-car chars))
(if (c-char-ci>=? char (c-car chars))
(iter (c-car chars) (c-cdr chars))
#f)
(error '|(char-ci>=?) wrong type of argument --| args))))
(if (c-char? (c-car args))
(iter (c-car args) (c-cdr args))
(error '|(char-ci>=?) wrong type of argument --| args)))
(error '|(char-ci>=?) wrong number of arguments --| args)))
(define (char-ci>? . args)
(if (c-< 1 (c-length args))
(begin
(define (iter char chars)
(if (c-null? chars)
#t
(if (c-char? (c-car chars))
(if (c-char-ci>? char (c-car chars))
(iter (c-car chars) (c-cdr chars))
#f)
(error '|(char-ci>?) wrong type of argument --| args))))
(if (c-char? (c-car args))
(iter (c-car args) (c-cdr args))
(error '|(char-ci>?) wrong type of argument --| args)))
(error '|(char-ci>?) wrong number of arguments --| args)))
(define (char-downcase . args)
(if (c-= (c-length args) 1)
(if (c-char? (c-car args))
(c-char-downcase (c-car args))
(error '|(char-downcase) wrong type of argument --| args))
(error '|(char-downcase) wrong number of arguments --| args)))
(define (char-foldcase . args)
(if (c-= (c-length args) 1)
(if (c-char? (c-car args))
(c-char-foldcase (c-car args))
(error '|(char-foldcase) wrong type of argument --| args))
(error '|(char-foldcase) wrong number of arguments --| args)))
(define (char-lower-case? . args)
(if (c-= (c-length args) 1)
(if (c-char? (c-car args))
(c-char-lower-case? (c-car args))
(error '|(char-lower-case?) wrong type of argument --| args))
(error '|(char-lower-case?) wrong number of arguments --| args)))
(define (char-numeric? . args)
(if (c-= (c-length args) 1)
(if (c-char? (c-car args))
(c-char-numeric? (c-car args))
(error '|(char-numeric?) wrong type of argument --| args))
(error '|(char-numeric?) wrong number of arguments --| args)))
(define (char-upcase . args)
(if (c-= (c-length args) 1)
(if (c-char? (c-car args))
(c-char-upcase (c-car args))
(error '|(char-upcase) wrong type of argument --| args))
(error '|(char-upcase) wrong number of arguments --| args)))
(define (char-upper-case? . args)
(if (c-= (c-length args) 1)
(if (c-char? (c-car args))
(c-char-upper-case? (c-car args))
(error '|(char-upper-case?) wrong type of argument --| args))
(error '|(char-upper-case?) wrong number of arguments --| args)))
(define (char-whitespace? . args)
(if (c-= (c-length args) 1)
(if (c-char? (c-car args))
(c-char-whitespace? (c-car args))
(error '|(char-whitespace?) wrong type of argument --| args))
(error '|(char-whitespace?) wrong number of arguments --| args)))
(define (digit-value . args)
(if (c-= (c-length args) 1)
(if (c-char? (c-car args))
(c-digit-value (c-car args))
(error '|(digit-value) wrong type of argument --| args))
(error '|(digit-value) wrong number of arguments --| args)))
)
lib/stdlib/char/compound_procedures.scm
(begin
(define (string-ci<=? string . list-of-string)
(define (iter string list-of-string)
(if (null? list-of-string)
#t
(if (string<=? (string-foldcase string)
(string-foldcase (car list-of-string)))
(iter (car list-of-string) (cdr list-of-string))
#f)))
(iter string list-of-string))
(define (string-ci<? string . list-of-string)
(define (iter string list-of-string)
(if (null? list-of-string)
#t
(if (string<? (string-foldcase string)
(string-foldcase (car list-of-string)))
(iter (car list-of-string) (cdr list-of-string))
#f)))
(iter string list-of-string))
(define (string-ci=? string . list-of-string)
(define (iter string list-of-string)
(if (null? list-of-string)
#t
(if (string=? (string-foldcase string)
(string-foldcase (car list-of-string)))
(iter (car list-of-string) (cdr list-of-string))
#f)))
(iter string list-of-string))
(define (string-ci>=? string . list-of-string)
(define (iter string list-of-string)
(if (null? list-of-string)
#t
(if (string>=? (string-foldcase string)
(string-foldcase (car list-of-string)))
(iter (car list-of-string) (cdr list-of-string))
#f)))
(iter string list-of-string))
(define (string-ci>? string . list-of-string)
(define (iter string list-of-string)
(if (null? list-of-string)
#t
(if (string>? (string-foldcase string)
(string-foldcase (car list-of-string)))
(iter (car list-of-string) (cdr list-of-string))
#f)))
(iter string list-of-string))
(define (string-downcase string) (string-map char-downcase string))
(define (string-foldcase string) (string-map char-foldcase string))
(define (string-upcase string) (string-map char-upcase string))
)
0 コメント:
コメントを投稿