mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-16 00:30:21 +02:00
*** empty log message ***
This commit is contained in:
parent
499a4c07c7
commit
a80be762c3
18 changed files with 267 additions and 375 deletions
|
@ -24,6 +24,7 @@
|
||||||
:use-module (system il ghil)
|
:use-module (system il ghil)
|
||||||
:use-module (language r5rs expand)
|
:use-module (language r5rs expand)
|
||||||
:use-module (ice-9 match)
|
:use-module (ice-9 match)
|
||||||
|
:use-module (ice-9 and-let-star)
|
||||||
:export (gscheme))
|
:export (gscheme))
|
||||||
|
|
||||||
|
|
||||||
|
@ -53,28 +54,28 @@
|
||||||
(define (translate x) (if (pair? x) (translate-pair x) x))
|
(define (translate x) (if (pair? x) (translate-pair x) x))
|
||||||
|
|
||||||
(define (translate-pair x)
|
(define (translate-pair x)
|
||||||
(let ((name (car x)) (args (cdr x)))
|
(let ((head (car x)) (rest (cdr x)))
|
||||||
(case name
|
(case head
|
||||||
((quote) (cons '@quote args))
|
((quote) (cons '@quote rest))
|
||||||
((define set! if and or begin)
|
((define set! if and or begin)
|
||||||
(cons (symbol-append '@ name) (map translate args)))
|
(cons (symbol-append '@ head) (map translate rest)))
|
||||||
((let let* letrec)
|
((let let* letrec)
|
||||||
(match x
|
(match x
|
||||||
(('let (? symbol? f) ((s v) ...) body ...)
|
(('let (? symbol? f) ((s v) ...) body ...)
|
||||||
`(@letrec ((,f (@lambda ,s ,@(map translate body))))
|
`(@letrec ((,f (@lambda ,s ,@(map translate body))))
|
||||||
(,f ,@(map translate v))))
|
(,f ,@(map translate v))))
|
||||||
(else
|
(else
|
||||||
(cons* (symbol-append '@ name)
|
(cons* (symbol-append '@ head)
|
||||||
(map (lambda (b) (cons (car b) (map translate (cdr b))))
|
(map (lambda (b) (cons (car b) (map translate (cdr b))))
|
||||||
(car args))
|
(car rest))
|
||||||
(map translate (cdr args))))))
|
(map translate (cdr rest))))))
|
||||||
((lambda)
|
((lambda)
|
||||||
(cons* '@lambda (car args) (map translate (cdr args))))
|
(cons* '@lambda (car rest) (map translate (cdr rest))))
|
||||||
(else
|
(else
|
||||||
(let ((prim (symbol-append '@ name)))
|
(let ((prim (and (symbol? head) (symbol-append '@ head))))
|
||||||
(if (ghil-primitive? prim)
|
(if (and prim (ghil-primitive? prim))
|
||||||
(cons prim (map translate args))
|
(cons prim (map translate rest))
|
||||||
(cons (translate name) (map translate args))))))))
|
(cons (translate head) (map translate rest))))))))
|
||||||
|
|
||||||
|
|
||||||
;;;
|
;;;
|
||||||
|
|
|
@ -66,6 +66,7 @@
|
||||||
(define remprop symbol-property-remove!)
|
(define remprop symbol-property-remove!)
|
||||||
|
|
||||||
(define syncase-module (current-module))
|
(define syncase-module (current-module))
|
||||||
|
|
||||||
(define (sc-eval x) (eval x syncase-module))
|
(define (sc-eval x) (eval x syncase-module))
|
||||||
|
|
||||||
(load "psyntax.scm")
|
(load "psyntax.scm")
|
||||||
|
|
|
@ -63,6 +63,7 @@
|
||||||
(define core-eval eval)
|
(define core-eval eval)
|
||||||
(define (eval x) (core-eval (cadr x) (interaction-environment)))
|
(define (eval x) (core-eval (cadr x) (interaction-environment)))
|
||||||
|
|
||||||
|
(debug-set! stack 0)
|
||||||
(load "psyntax.pp")
|
(load "psyntax.pp")
|
||||||
|
|
||||||
(call-with-input-file "psyntax.ss"
|
(call-with-input-file "psyntax.ss"
|
||||||
|
|
File diff suppressed because one or more lines are too long
|
@ -2744,7 +2744,8 @@
|
||||||
;;; expanded, and the expanded definitions are also residualized into
|
;;; expanded, and the expanded definitions are also residualized into
|
||||||
;;; the object file if we are compiling a file.
|
;;; the object file if we are compiling a file.
|
||||||
(set! sc-expand
|
(set! sc-expand
|
||||||
(let ((user-ribcage
|
(let ((m 'e) (esew '(eval))
|
||||||
|
(user-ribcage
|
||||||
(let ((ribcage (make-empty-ribcage)))
|
(let ((ribcage (make-empty-ribcage)))
|
||||||
(extend-ribcage-subst! ribcage '*top*)
|
(extend-ribcage-subst! ribcage '*top*)
|
||||||
ribcage)))
|
ribcage)))
|
||||||
|
@ -2752,11 +2753,9 @@
|
||||||
(make-wrap (wrap-marks top-wrap)
|
(make-wrap (wrap-marks top-wrap)
|
||||||
(cons user-ribcage (wrap-subst top-wrap)))))
|
(cons user-ribcage (wrap-subst top-wrap)))))
|
||||||
(lambda (x)
|
(lambda (x)
|
||||||
(let ((m 'e)
|
|
||||||
(esew '(eval)))
|
|
||||||
(if (and (pair? x) (equal? (car x) noexpand))
|
(if (and (pair? x) (equal? (car x) noexpand))
|
||||||
(cadr x)
|
(cadr x)
|
||||||
(chi-top x null-env user-top-wrap m esew user-ribcage)))))))
|
(chi-top x null-env user-top-wrap m esew user-ribcage))))))
|
||||||
|
|
||||||
(set! identifier?
|
(set! identifier?
|
||||||
(lambda (x)
|
(lambda (x)
|
||||||
|
|
|
@ -33,21 +33,20 @@
|
||||||
(define (translate x) (if (pair? x) (translate-pair x) x))
|
(define (translate x) (if (pair? x) (translate-pair x) x))
|
||||||
|
|
||||||
(define (translate-pair x)
|
(define (translate-pair x)
|
||||||
(let ((name (car x)) (args (cdr x)))
|
(let ((head (car x)) (rest (cdr x)))
|
||||||
(case name
|
(case head
|
||||||
((quote) (cons '@quote args))
|
((quote) (cons '@quote rest))
|
||||||
((define set! if and or begin)
|
((define set! if and or begin)
|
||||||
(cons (symbol-append '@ name) (map translate args)))
|
(cons (symbol-append '@ head) (map translate rest)))
|
||||||
((let let* letrec)
|
((let let* letrec)
|
||||||
(cons* (symbol-append '@ name)
|
(cons* (symbol-append '@ head)
|
||||||
(map (lambda (b)
|
(map (lambda (b) (cons (car b) (map translate (cdr b))))
|
||||||
(cons (car b) (map translate (cdr b))))
|
(car rest))
|
||||||
(car args))
|
(map translate (cdr rest))))
|
||||||
(map translate (cdr args))))
|
|
||||||
((lambda)
|
((lambda)
|
||||||
(cons* '@lambda (car args) (map translate (cdr args))))
|
(cons* '@lambda (car rest) (map translate (cdr rest))))
|
||||||
(else
|
(else
|
||||||
(cons (translate name) (map translate args))))))
|
(cons (translate head) (map translate rest))))))
|
||||||
|
|
||||||
|
|
||||||
;;;
|
;;;
|
||||||
|
|
|
@ -50,19 +50,6 @@
|
||||||
(let ((sym (make-sym)))
|
(let ((sym (make-sym)))
|
||||||
`(@let ((,sym ,x)) (@if ,sym ,sym (@or ,@rest)))))))
|
`(@let ((,sym ,x)) (@if ,sym ,sym (@or ,@rest)))))))
|
||||||
|
|
||||||
;; (@while TEST BODY...) =>
|
|
||||||
;;
|
|
||||||
;; (@goto L1)
|
|
||||||
;; L0: BODY...
|
|
||||||
;; L1: (@if TEST (@goto L0) (@void))
|
|
||||||
;;; non-R5RS
|
|
||||||
(define (@while test . body)
|
|
||||||
(let ((L0 (make-label)) (L1 (make-label)))
|
|
||||||
`(@begin
|
|
||||||
(@goto ,L1)
|
|
||||||
(@label ,L0) ,@body
|
|
||||||
(@label ,L1) (@if ,test (@goto ,L0) (@void)))))
|
|
||||||
|
|
||||||
;; (@cond (TEST BODY...) ...) =>
|
;; (@cond (TEST BODY...) ...) =>
|
||||||
;;
|
;;
|
||||||
;; (@if TEST
|
;; (@if TEST
|
||||||
|
@ -98,14 +85,14 @@
|
||||||
|
|
||||||
;;; 6.2 Numbers
|
;;; 6.2 Numbers
|
||||||
|
|
||||||
(define (@number? x) `(@@ number? ,x))
|
(define (@number? x) `((@ Core::number?) ,x))
|
||||||
(define (@complex? x) `(@@ complex? ,x))
|
(define (@complex? x) `((@ Core::complex?) ,x))
|
||||||
(define (@real? x) `(@@ real? ,x))
|
(define (@real? x) `((@ Core::real?) ,x))
|
||||||
(define (@rational? x) `(@@ rational? ,x))
|
(define (@rational? x) `((@ Core::rational?) ,x))
|
||||||
(define (@integer? x) `(@@ integer? ,x))
|
(define (@integer? x) `((@ Core::integer?) ,x))
|
||||||
|
|
||||||
(define (@exact? x) `(@@ exact? ,x))
|
(define (@exact? x) `((@ Core::exact?) ,x))
|
||||||
(define (@inexact? x) `(@@ inexact? ,x))
|
(define (@inexact? x) `((@ Core::inexact?) ,x))
|
||||||
|
|
||||||
(define (@= x y) `(@@ ee? ,x ,y))
|
(define (@= x y) `(@@ ee? ,x ,y))
|
||||||
(define (@< x y) `(@@ lt? ,x ,y))
|
(define (@< x y) `(@@ lt? ,x ,y))
|
||||||
|
@ -113,15 +100,6 @@
|
||||||
(define (@<= x y) `(@@ le? ,x ,y))
|
(define (@<= x y) `(@@ le? ,x ,y))
|
||||||
(define (@>= x y) `(@@ ge? ,x ,y))
|
(define (@>= x y) `(@@ ge? ,x ,y))
|
||||||
|
|
||||||
(define (@zero? x) `(@= ,x 0))
|
|
||||||
(define (@positive? x) `(@> ,x 0))
|
|
||||||
(define (@negative? x) `(@< ,x 0))
|
|
||||||
(define (@odd? x) `(@= (@modulo ,x 2) 1))
|
|
||||||
(define (@even? x) `(@= (@modulo ,x 2) 0))
|
|
||||||
|
|
||||||
(define (@max . args) `(@@ max ,@args))
|
|
||||||
(define (@min . args) `(@@ min ,@args))
|
|
||||||
|
|
||||||
(define @+
|
(define @+
|
||||||
(match-lambda*
|
(match-lambda*
|
||||||
(() 0)
|
(() 0)
|
||||||
|
@ -138,25 +116,20 @@
|
||||||
|
|
||||||
(define @-
|
(define @-
|
||||||
(match-lambda*
|
(match-lambda*
|
||||||
((x) `(@@ neg ,x))
|
((x) `(@@ sub 0 ,x))
|
||||||
((x y) `(@@ sub ,x ,y))
|
((x y) `(@@ sub ,x ,y))
|
||||||
((x y . rest) `(@@ sub ,x (@+ ,y ,@rest)))))
|
((x y . rest) `(@@ sub ,x (@+ ,y ,@rest)))))
|
||||||
|
|
||||||
(define @/
|
(define @/
|
||||||
(match-lambda*
|
(match-lambda*
|
||||||
((x) `(@@ rec ,x))
|
((x) `(@@ div 1 ,x))
|
||||||
((x y) `(@@ div ,x ,y))
|
((x y) `(@@ div ,x ,y))
|
||||||
((x y . rest) `(@@ div ,x (@* ,y ,@rest)))))
|
((x y . rest) `(@@ div ,x (@* ,y ,@rest)))))
|
||||||
|
|
||||||
(define (@abs x) `(@if (@< x 0) (@- x) x))
|
(define (@quotient x y) `(@@ quo ,x ,y))
|
||||||
|
(define (@remainder x y) `(@@ rem ,x ,y))
|
||||||
|
(define (@modulo x y) `(@@ mod ,x ,y))
|
||||||
|
|
||||||
(define (@quotient x y) `(@@ quotient ,x ,y))
|
|
||||||
(define (@remainder x y) `(@@ remainder ,x ,y))
|
|
||||||
(define (@modulo x y) `(@@ modulo ,x ,y))
|
|
||||||
|
|
||||||
;;; gcd
|
|
||||||
;;; lcm
|
|
||||||
;;;
|
|
||||||
;;; numerator
|
;;; numerator
|
||||||
;;; denominator
|
;;; denominator
|
||||||
;;;
|
;;;
|
||||||
|
@ -165,8 +138,6 @@
|
||||||
;;; truncate
|
;;; truncate
|
||||||
;;; round
|
;;; round
|
||||||
;;;
|
;;;
|
||||||
;;; rationalize
|
|
||||||
;;;
|
|
||||||
;;; exp
|
;;; exp
|
||||||
;;; log
|
;;; log
|
||||||
;;; sin
|
;;; sin
|
||||||
|
@ -197,7 +168,7 @@
|
||||||
;;;; 6.3.1 Booleans
|
;;;; 6.3.1 Booleans
|
||||||
|
|
||||||
(define (@not x) `(@@ not ,x))
|
(define (@not x) `(@@ not ,x))
|
||||||
(define (@boolean? x) `(@@ boolean? ,x))
|
(define (@boolean? x) `((@ Core::boolean?) ,x))
|
||||||
|
|
||||||
;;;; 6.3.2 Pairs and lists
|
;;;; 6.3.2 Pairs and lists
|
||||||
|
|
||||||
|
@ -245,8 +216,6 @@
|
||||||
;;; length
|
;;; length
|
||||||
;;; append
|
;;; append
|
||||||
;;; reverse
|
;;; reverse
|
||||||
;;; list-tail
|
|
||||||
;;; list-ref
|
|
||||||
;;;
|
;;;
|
||||||
;;; memq
|
;;; memq
|
||||||
;;; memv
|
;;; memv
|
||||||
|
@ -270,74 +239,34 @@
|
||||||
;;; char>?
|
;;; char>?
|
||||||
;;; char<=?
|
;;; char<=?
|
||||||
;;; char>=?
|
;;; char>=?
|
||||||
;;; char-ci=?
|
|
||||||
;;; char-ci<?
|
|
||||||
;;; char-ci>?
|
|
||||||
;;; char-ci<=?
|
|
||||||
;;; char-ci>=?
|
|
||||||
;;; char-alphabetic?
|
|
||||||
;;; char-numeric?
|
|
||||||
;;; char-whitespace?
|
|
||||||
;;; char-upper-case?
|
|
||||||
;;; char-lower-case?
|
|
||||||
;;; char->integer
|
;;; char->integer
|
||||||
;;; integer->char
|
;;; integer->char
|
||||||
;;; char-upcase
|
|
||||||
;;; char-downcase
|
|
||||||
|
|
||||||
;;;; 6.3.5 Strings
|
;;;; 6.3.5 Strings
|
||||||
|
|
||||||
;;; string?
|
;;; string?
|
||||||
;;; make-string
|
;;; make-string
|
||||||
;;; string
|
|
||||||
;;; string-length
|
;;; string-length
|
||||||
;;; string-ref
|
;;; string-ref
|
||||||
;;; string-set!
|
;;; string-set!
|
||||||
;;;
|
|
||||||
;;; string=?
|
|
||||||
;;; string-ci=?
|
|
||||||
;;; string<?
|
|
||||||
;;; string>?
|
|
||||||
;;; string<=?
|
|
||||||
;;; string>=?
|
|
||||||
;;; string-ci<?
|
|
||||||
;;; string-ci>?
|
|
||||||
;;; string-ci<=?
|
|
||||||
;;; string-ci>=?
|
|
||||||
;;;
|
|
||||||
;;; substring
|
|
||||||
;;; string-append
|
|
||||||
;;; string->list
|
|
||||||
;;; list->string
|
|
||||||
;;; string-copy
|
|
||||||
;;; string-fill!
|
|
||||||
|
|
||||||
;;;; 6.3.6 Vectors
|
;;;; 6.3.6 Vectors
|
||||||
|
|
||||||
;;; vector?
|
;;; vector?
|
||||||
;;; make-vector
|
;;; make-vector
|
||||||
;;; vector
|
|
||||||
;;; vector-length
|
;;; vector-length
|
||||||
;;; vector-ref
|
;;; vector-ref
|
||||||
;;; vector-set!
|
;;; vector-set!
|
||||||
;;; vector->list
|
|
||||||
;;; list->vector
|
|
||||||
;;; vector-fill!
|
|
||||||
|
|
||||||
;;;; 6.4 Control features
|
;;;; 6.4 Control features
|
||||||
|
|
||||||
(define (@procedure? x) `(@@ procedure? x))
|
;; (define (@procedure? x) `(@@ procedure? x))
|
||||||
|
|
||||||
;; (define (@apply proc . args) ...)
|
;; (define (@apply proc . args) ...)
|
||||||
|
|
||||||
;;; map
|
|
||||||
;;; for-each
|
|
||||||
|
|
||||||
;;; (define (@force promise) `(@@ force promise))
|
;;; (define (@force promise) `(@@ force promise))
|
||||||
|
|
||||||
;;; (define (@call-with-current-continuation proc) `(@@ call/cc proc))
|
;;; (define (@call/cc proc) `(@@ call/cc proc))
|
||||||
|
|
||||||
;;; (define @call/cc @call-with-current-continuation)
|
|
||||||
|
|
||||||
;;; values
|
;;; values
|
||||||
;;; call-with-values
|
;;; call-with-values
|
||||||
|
@ -345,26 +274,15 @@
|
||||||
|
|
||||||
;;; 6.5 Eval
|
;;; 6.5 Eval
|
||||||
|
|
||||||
;;; eval
|
|
||||||
;;; scheme-report-environment
|
|
||||||
;;; null-environment
|
|
||||||
;;; interaction-environment
|
|
||||||
|
|
||||||
;;; 6.6 Input and output
|
;;; 6.6 Input and output
|
||||||
|
|
||||||
;;;; 6.6.1 Ports
|
;;;; 6.6.1 Ports
|
||||||
|
|
||||||
;;; call-with-input-file
|
|
||||||
;;; call-with-output-file
|
|
||||||
;;;
|
|
||||||
;;; input-port?
|
;;; input-port?
|
||||||
;;; output-port?
|
;;; output-port?
|
||||||
;;; current-input-port
|
;;; current-input-port
|
||||||
;;; current-output-port
|
;;; current-output-port
|
||||||
;;;
|
;;;
|
||||||
;;; with-input-from-file
|
|
||||||
;;; with-output-to-file
|
|
||||||
;;;
|
|
||||||
;;; open-input-file
|
;;; open-input-file
|
||||||
;;; open-output-file
|
;;; open-output-file
|
||||||
;;; close-input-port
|
;;; close-input-port
|
||||||
|
@ -387,10 +305,6 @@
|
||||||
|
|
||||||
;;;; 6.6.4 System interface
|
;;;; 6.6.4 System interface
|
||||||
|
|
||||||
;;; load
|
|
||||||
;;; transcript-on
|
|
||||||
;;; transcript-off
|
|
||||||
|
|
||||||
|
|
||||||
;;;
|
;;;
|
||||||
;;; Non-R5RS Procedures
|
;;; Non-R5RS Procedures
|
||||||
|
@ -401,8 +315,3 @@
|
||||||
((x) x)
|
((x) x)
|
||||||
((x y) `(@cons ,x ,y))
|
((x y) `(@cons ,x ,y))
|
||||||
((x y . rest) `(@cons ,x (@cons* ,y ,@rest)))))
|
((x y . rest) `(@cons ,x (@cons* ,y ,@rest)))))
|
||||||
|
|
||||||
(define (@error . args) `(@@ display ,@args))
|
|
||||||
|
|
||||||
(define (@current-module)
|
|
||||||
`((@ System::Base::module::current-module)))
|
|
||||||
|
|
|
@ -238,12 +238,14 @@
|
||||||
(push-code! `(link/current-module)))
|
(push-code! `(link/current-module)))
|
||||||
;;((vmod? x)
|
;;((vmod? x)
|
||||||
;; (push-code! `(load-module ,(vmod-id x))))
|
;; (push-code! `(load-module ,(vmod-id x))))
|
||||||
((integer? x)
|
((and (integer? x) (exact? x))
|
||||||
(let ((str (do ((n x (quotient n 256))
|
(let ((str (do ((n x (quotient n 256))
|
||||||
(l '() (cons (modulo n 256) l)))
|
(l '() (cons (modulo n 256) l)))
|
||||||
((= n 0)
|
((= n 0)
|
||||||
(list->string (map integer->char l))))))
|
(list->string (map integer->char l))))))
|
||||||
(push-code! `(load-integer ,str))))
|
(push-code! `(load-integer ,str))))
|
||||||
|
((number? x)
|
||||||
|
(push-code! `(load-number ,(number->string x))))
|
||||||
((string? x)
|
((string? x)
|
||||||
(push-code! `(load-string ,x)))
|
(push-code! `(load-string ,x)))
|
||||||
((symbol? x)
|
((symbol? x)
|
||||||
|
|
|
@ -23,7 +23,8 @@
|
||||||
:use-module (system vm core)
|
:use-module (system vm core)
|
||||||
:use-module (ice-9 match)
|
:use-module (ice-9 match)
|
||||||
:use-module (ice-9 regex)
|
:use-module (ice-9 regex)
|
||||||
:export (code-pack code-unpack object->code code->object code->bytes))
|
:export (code-pack code-unpack object->code code->object code->bytes
|
||||||
|
make-byte-decoder))
|
||||||
|
|
||||||
;;;
|
;;;
|
||||||
;;; Code compress/decompression
|
;;; Code compress/decompression
|
||||||
|
@ -62,7 +63,7 @@
|
||||||
(cond ((eq? x #t) `(make-true))
|
(cond ((eq? x #t) `(make-true))
|
||||||
((eq? x #f) `(make-false))
|
((eq? x #f) `(make-false))
|
||||||
((null? x) `(make-eol))
|
((null? x) `(make-eol))
|
||||||
((integer? x)
|
((and (integer? x) (exact? x))
|
||||||
(cond ((and (<= -128 x) (< x 128))
|
(cond ((and (<= -128 x) (< x 128))
|
||||||
`(make-int8 ,(modulo x 256)))
|
`(make-int8 ,(modulo x 256)))
|
||||||
((and (<= -32768 x) (< x 32768))
|
((and (<= -32768 x) (< x 32768))
|
||||||
|
@ -104,7 +105,7 @@
|
||||||
(else
|
(else
|
||||||
(error "Invalid code:" code)))))
|
(error "Invalid code:" code)))))
|
||||||
|
|
||||||
(define-public (make-byte-decoder bytes)
|
(define (make-byte-decoder bytes)
|
||||||
(let ((addr 0) (size (string-length bytes)))
|
(let ((addr 0) (size (string-length bytes)))
|
||||||
(define (pop)
|
(define (pop)
|
||||||
(let ((byte (char->integer (string-ref bytes addr))))
|
(let ((byte (char->integer (string-ref bytes addr))))
|
||||||
|
@ -135,17 +136,16 @@
|
||||||
|
|
||||||
(define (encode-length len)
|
(define (encode-length len)
|
||||||
(define C integer->char)
|
(define C integer->char)
|
||||||
(list->string
|
(cond ((< len 254) (string (C len)))
|
||||||
(cond ((< len 254) (list (C len)))
|
|
||||||
((< len (* 256 256))
|
((< len (* 256 256))
|
||||||
(list (C 254) (C (quotient len 256)) (C (modulo len 256))))
|
(string (C 254) (C (quotient len 256)) (C (modulo len 256))))
|
||||||
((< len most-positive-fixnum)
|
((< len most-positive-fixnum)
|
||||||
(list (C 255)
|
(string (C 255)
|
||||||
(C (quotient len (* 256 256 256)))
|
(C (quotient len (* 256 256 256)))
|
||||||
(C (modulo (quotient len (* 256 256)) 256))
|
(C (modulo (quotient len (* 256 256)) 256))
|
||||||
(C (modulo (quotient len 256) 256))
|
(C (modulo (quotient len 256) 256))
|
||||||
(C (modulo len 256))))
|
(C (modulo len 256))))
|
||||||
(else (error "Too long code length:" len)))))
|
(else (error "Too long code length:" len))))
|
||||||
|
|
||||||
(define (decode-length pop)
|
(define (decode-length pop)
|
||||||
(let ((len (pop)))
|
(let ((len (pop)))
|
||||||
|
|
|
@ -63,7 +63,7 @@
|
||||||
(set! rest (acons sym x rest))
|
(set! rest (acons sym x rest))
|
||||||
(print-info addr (format #f "load-program #~A" sym) #f)))
|
(print-info addr (format #f "load-program #~A" sym) #f)))
|
||||||
(else
|
(else
|
||||||
(let ((info (list->string code))
|
(let ((info (list->info code))
|
||||||
(extra (original-value addr code
|
(extra (original-value addr code
|
||||||
(if (null? opt) #f (car opt)))))
|
(if (null? opt) #f (car opt)))))
|
||||||
(print-info addr info extra))))))
|
(print-info addr info extra))))))
|
||||||
|
@ -83,7 +83,7 @@
|
||||||
(define (disassemble-meta meta)
|
(define (disassemble-meta meta)
|
||||||
(display "Meta info:\n\n")
|
(display "Meta info:\n\n")
|
||||||
(for-each (lambda (data)
|
(for-each (lambda (data)
|
||||||
(print-info (car data) (list->string (cdr data)) #f))
|
(print-info (car data) (list->info (cdr data)) #f))
|
||||||
meta)
|
meta)
|
||||||
(newline))
|
(newline))
|
||||||
|
|
||||||
|
@ -109,7 +109,7 @@
|
||||||
;;; (if (pair? var) (car var) var))))
|
;;; (if (pair? var) (car var) var))))
|
||||||
(else #f)))))))
|
(else #f)))))))
|
||||||
|
|
||||||
(define (list->string list)
|
(define (list->info list)
|
||||||
(let ((str (object->string list)))
|
(let ((str (object->string list)))
|
||||||
(substring str 1 (1- (string-length str)))))
|
(substring str 1 (1- (string-length str)))))
|
||||||
|
|
||||||
|
|
|
@ -7,8 +7,8 @@ lib_LTLIBRARIES = libguilevm.la
|
||||||
libguilevm_la_SOURCES = envs.c instructions.c programs.c vm.c \
|
libguilevm_la_SOURCES = envs.c instructions.c programs.c vm.c \
|
||||||
envs.h instructions.h programs.h vm.h vm_engine.h vm_expand.h
|
envs.h instructions.h programs.h vm.h vm_engine.h vm_expand.h
|
||||||
libguilevm_la_LDFLAGS = -version-info 0:0:0 -export-dynamic
|
libguilevm_la_LDFLAGS = -version-info 0:0:0 -export-dynamic
|
||||||
EXTRA_DIST = vm_engine.c vm_system.c vm_scheme.c vm_number.c vm_loader.c
|
EXTRA_DIST = vm_engine.c vm_system.c vm_scheme.c vm_loader.c
|
||||||
BUILT_SOURCES = vm_system.i vm_scheme.i vm_number.i vm_loader.i \
|
BUILT_SOURCES = vm_system.i vm_scheme.i vm_loader.i \
|
||||||
envs.x instructions.x programs.x vm.x
|
envs.x instructions.x programs.x vm.x
|
||||||
|
|
||||||
INCLUDES = $(GUILE_CFLAGS)
|
INCLUDES = $(GUILE_CFLAGS)
|
||||||
|
|
|
@ -47,7 +47,6 @@ struct scm_instruction scm_instruction_table[] = {
|
||||||
#include "vm_expand.h"
|
#include "vm_expand.h"
|
||||||
#include "vm_system.i"
|
#include "vm_system.i"
|
||||||
#include "vm_scheme.i"
|
#include "vm_scheme.i"
|
||||||
#include "vm_number.i"
|
|
||||||
#include "vm_loader.i"
|
#include "vm_loader.i"
|
||||||
#undef VM_INSTRUCTION_TO_TABLE
|
#undef VM_INSTRUCTION_TO_TABLE
|
||||||
{scm_op_last}
|
{scm_op_last}
|
||||||
|
|
|
@ -50,7 +50,6 @@ enum scm_opcode {
|
||||||
#include "vm_expand.h"
|
#include "vm_expand.h"
|
||||||
#include "vm_system.i"
|
#include "vm_system.i"
|
||||||
#include "vm_scheme.i"
|
#include "vm_scheme.i"
|
||||||
#include "vm_number.i"
|
|
||||||
#include "vm_loader.i"
|
#include "vm_loader.i"
|
||||||
#undef VM_INSTRUCTION_TO_OPCODE
|
#undef VM_INSTRUCTION_TO_OPCODE
|
||||||
scm_op_last
|
scm_op_last
|
||||||
|
|
|
@ -77,7 +77,6 @@ vm_engine (SCM vm, SCM program, SCM args)
|
||||||
#include "vm_expand.h"
|
#include "vm_expand.h"
|
||||||
#include "vm_system.i"
|
#include "vm_system.i"
|
||||||
#include "vm_scheme.i"
|
#include "vm_scheme.i"
|
||||||
#include "vm_number.i"
|
|
||||||
#include "vm_loader.i"
|
#include "vm_loader.i"
|
||||||
#undef VM_INSTRUCTION_TO_LABEL
|
#undef VM_INSTRUCTION_TO_LABEL
|
||||||
};
|
};
|
||||||
|
@ -114,7 +113,6 @@ vm_engine (SCM vm, SCM program, SCM args)
|
||||||
#include "vm_expand.h"
|
#include "vm_expand.h"
|
||||||
#include "vm_system.c"
|
#include "vm_system.c"
|
||||||
#include "vm_scheme.c"
|
#include "vm_scheme.c"
|
||||||
#include "vm_number.c"
|
|
||||||
#include "vm_loader.c"
|
#include "vm_loader.c"
|
||||||
|
|
||||||
#ifndef HAVE_LABELS_AS_VALUES
|
#ifndef HAVE_LABELS_AS_VALUES
|
||||||
|
|
|
@ -249,7 +249,7 @@ do { \
|
||||||
#define ARGS3(a1,a2,a3) SCM a1 = sp[2], a2 = sp[1], a3 = sp[0]; sp += 2;
|
#define ARGS3(a1,a2,a3) SCM a1 = sp[2], a2 = sp[1], a3 = sp[0]; sp += 2;
|
||||||
#define ARGSN(an) int an = FETCH ();
|
#define ARGSN(an) int an = FETCH ();
|
||||||
|
|
||||||
#define RETURN(x) { *sp = x; NEXT; }
|
#define RETURN(x) do { *sp = x; NEXT; } while (0)
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -58,11 +58,11 @@ VM_DEFINE_INSTRUCTION (load_integer, "load-integer", -1, 0, 1)
|
||||||
SCM_MISC_ERROR ("load-integer: not implemented yet", SCM_EOL);
|
SCM_MISC_ERROR ("load-integer: not implemented yet", SCM_EOL);
|
||||||
}
|
}
|
||||||
|
|
||||||
VM_DEFINE_INSTRUCTION (load_symbol, "load-symbol", -1, 0, 1)
|
VM_DEFINE_INSTRUCTION (load_number, "load-number", -1, 0, 1)
|
||||||
{
|
{
|
||||||
size_t len;
|
size_t len;
|
||||||
FETCH_LENGTH (len);
|
FETCH_LENGTH (len);
|
||||||
PUSH (scm_mem2symbol (ip, len));
|
PUSH (scm_istring2number (ip, len, 10));
|
||||||
ip += len;
|
ip += len;
|
||||||
NEXT;
|
NEXT;
|
||||||
}
|
}
|
||||||
|
@ -76,6 +76,15 @@ VM_DEFINE_INSTRUCTION (load_string, "load-string", -1, 0, 1)
|
||||||
NEXT;
|
NEXT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
VM_DEFINE_INSTRUCTION (load_symbol, "load-symbol", -1, 0, 1)
|
||||||
|
{
|
||||||
|
size_t len;
|
||||||
|
FETCH_LENGTH (len);
|
||||||
|
PUSH (scm_mem2symbol (ip, len));
|
||||||
|
ip += len;
|
||||||
|
NEXT;
|
||||||
|
}
|
||||||
|
|
||||||
VM_DEFINE_INSTRUCTION (load_keyword, "load-keyword", -1, 0, 1)
|
VM_DEFINE_INSTRUCTION (load_keyword, "load-keyword", -1, 0, 1)
|
||||||
{
|
{
|
||||||
SCM sym;
|
SCM sym;
|
||||||
|
|
168
src/vm_number.c
168
src/vm_number.c
|
@ -1,168 +0,0 @@
|
||||||
/* Copyright (C) 2000 Free Software Foundation, Inc.
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation; either version 2, or (at your option)
|
|
||||||
* any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this software; see the file COPYING. If not, write to
|
|
||||||
* the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
|
|
||||||
* Boston, MA 02111-1307 USA
|
|
||||||
*
|
|
||||||
* As a special exception, the Free Software Foundation gives permission
|
|
||||||
* for additional uses of the text contained in its release of GUILE.
|
|
||||||
*
|
|
||||||
* The exception is that, if you link the GUILE library with other files
|
|
||||||
* to produce an executable, this does not by itself cause the
|
|
||||||
* resulting executable to be covered by the GNU General Public License.
|
|
||||||
* Your use of that executable is in no way restricted on account of
|
|
||||||
* linking the GUILE library code into it.
|
|
||||||
*
|
|
||||||
* This exception does not however invalidate any other reasons why
|
|
||||||
* the executable file might be covered by the GNU General Public License.
|
|
||||||
*
|
|
||||||
* This exception applies only to the code released by the
|
|
||||||
* Free Software Foundation under the name GUILE. If you copy
|
|
||||||
* code from other Free Software Foundation releases into a copy of
|
|
||||||
* GUILE, as the General Public License permits, the exception does
|
|
||||||
* not apply to the code that you add in this way. To avoid misleading
|
|
||||||
* anyone as to the status of such modified files, you must delete
|
|
||||||
* this exception notice from them.
|
|
||||||
*
|
|
||||||
* If you write modifications of your own for GUILE, it is your choice
|
|
||||||
* whether to permit this exception to apply to your modifications.
|
|
||||||
* If you do not wish that, delete this exception notice. */
|
|
||||||
|
|
||||||
/* This file is included in vm_engine.c */
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Predicates
|
|
||||||
*/
|
|
||||||
|
|
||||||
#undef PRED
|
|
||||||
#define PRED(ctest,stest) \
|
|
||||||
{ \
|
|
||||||
ARGS1 (a1); \
|
|
||||||
if (SCM_INUMP (a1)) \
|
|
||||||
RETURN (SCM_BOOL (ctest)); \
|
|
||||||
RETURN (stest (a1)); \
|
|
||||||
}
|
|
||||||
|
|
||||||
VM_DEFINE_FUNCTION (zero, "zero?", 1)
|
|
||||||
{
|
|
||||||
PRED (SCM_INUM (a1) == 0, scm_zero_p);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Relational tests
|
|
||||||
*/
|
|
||||||
|
|
||||||
#undef REL
|
|
||||||
#define REL(crel,srel) \
|
|
||||||
{ \
|
|
||||||
ARGS2 (a1, a2); \
|
|
||||||
if (SCM_INUMP (a1) && SCM_INUMP (a2)) \
|
|
||||||
RETURN (SCM_BOOL (SCM_INUM (a1) crel SCM_INUM (a2))); \
|
|
||||||
RETURN (srel (a1, a2)); \
|
|
||||||
}
|
|
||||||
|
|
||||||
VM_DEFINE_FUNCTION (ee, "ee?", 2)
|
|
||||||
{
|
|
||||||
REL (==, scm_num_eq_p);
|
|
||||||
}
|
|
||||||
|
|
||||||
VM_DEFINE_FUNCTION (lt, "lt?", 2)
|
|
||||||
{
|
|
||||||
REL (<, scm_less_p);
|
|
||||||
}
|
|
||||||
|
|
||||||
VM_DEFINE_FUNCTION (le, "le?", 2)
|
|
||||||
{
|
|
||||||
REL (<=, scm_leq_p);
|
|
||||||
}
|
|
||||||
|
|
||||||
VM_DEFINE_FUNCTION (gt, "gt?", 2)
|
|
||||||
{
|
|
||||||
REL (>, scm_gr_p);
|
|
||||||
}
|
|
||||||
|
|
||||||
VM_DEFINE_FUNCTION (ge, "ge?", 2)
|
|
||||||
{
|
|
||||||
REL (>=, scm_geq_p);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Functions
|
|
||||||
*/
|
|
||||||
|
|
||||||
#undef FUNC1
|
|
||||||
#define FUNC1(CEXP,SEXP) \
|
|
||||||
{ \
|
|
||||||
ARGS1 (a1); \
|
|
||||||
if (SCM_INUMP (a1)) \
|
|
||||||
{ \
|
|
||||||
int n = CEXP; \
|
|
||||||
if (SCM_FIXABLE (n)) \
|
|
||||||
RETURN (SCM_MAKINUM (n)); \
|
|
||||||
} \
|
|
||||||
RETURN (SEXP); \
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef FUNC2
|
|
||||||
#define FUNC2(CFUNC,SFUNC) \
|
|
||||||
{ \
|
|
||||||
ARGS2 (a1, a2); \
|
|
||||||
if (SCM_INUMP (a1) && SCM_INUMP (a2)) \
|
|
||||||
{ \
|
|
||||||
int n = SCM_INUM (a1) CFUNC SCM_INUM (a2); \
|
|
||||||
if (SCM_FIXABLE (n)) \
|
|
||||||
RETURN (SCM_MAKINUM (n)); \
|
|
||||||
} \
|
|
||||||
RETURN (SFUNC (a1, a2)); \
|
|
||||||
}
|
|
||||||
|
|
||||||
VM_DEFINE_FUNCTION (neg, "neg", 1)
|
|
||||||
{
|
|
||||||
FUNC1 (- SCM_INUM (a1), scm_difference (a1, SCM_UNDEFINED));
|
|
||||||
}
|
|
||||||
|
|
||||||
VM_DEFINE_FUNCTION (inc, "inc", 1)
|
|
||||||
{
|
|
||||||
FUNC1 (SCM_INUM (a1) + 1, scm_sum (a1, SCM_MAKINUM (1)));
|
|
||||||
}
|
|
||||||
|
|
||||||
VM_DEFINE_FUNCTION (dec, "dec", 1)
|
|
||||||
{
|
|
||||||
FUNC1 (SCM_INUM (a1) - 1, scm_difference (a1, SCM_MAKINUM (1)));
|
|
||||||
}
|
|
||||||
|
|
||||||
VM_DEFINE_FUNCTION (add, "add", 2)
|
|
||||||
{
|
|
||||||
FUNC2 (+, scm_sum);
|
|
||||||
}
|
|
||||||
|
|
||||||
VM_DEFINE_FUNCTION (sub, "sub", 2)
|
|
||||||
{
|
|
||||||
FUNC2 (-, scm_difference);
|
|
||||||
}
|
|
||||||
|
|
||||||
VM_DEFINE_FUNCTION (remainder, "remainder", 2)
|
|
||||||
{
|
|
||||||
ARGS2 (a1, a2);
|
|
||||||
RETURN (scm_remainder (a1, a2));
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
Local Variables:
|
|
||||||
c-file-style: "gnu"
|
|
||||||
End:
|
|
||||||
*/
|
|
213
src/vm_scheme.c
213
src/vm_scheme.c
|
@ -41,106 +41,249 @@
|
||||||
|
|
||||||
/* This file is included in vm_engine.c */
|
/* This file is included in vm_engine.c */
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Predicates
|
||||||
|
*/
|
||||||
|
|
||||||
VM_DEFINE_FUNCTION (not, "not", 1)
|
VM_DEFINE_FUNCTION (not, "not", 1)
|
||||||
{
|
{
|
||||||
ARGS1 (a1);
|
ARGS1 (x);
|
||||||
RETURN (SCM_BOOL (SCM_FALSEP (a1)));
|
RETURN (SCM_BOOL (SCM_FALSEP (x)));
|
||||||
}
|
}
|
||||||
|
|
||||||
VM_DEFINE_FUNCTION (not_not, "not-not", 1)
|
VM_DEFINE_FUNCTION (not_not, "not-not", 1)
|
||||||
{
|
{
|
||||||
ARGS1 (a1);
|
ARGS1 (x);
|
||||||
RETURN (SCM_BOOL (!SCM_FALSEP (a1)));
|
RETURN (SCM_BOOL (!SCM_FALSEP (x)));
|
||||||
}
|
}
|
||||||
|
|
||||||
VM_DEFINE_FUNCTION (eq, "eq?", 2)
|
VM_DEFINE_FUNCTION (eq, "eq?", 2)
|
||||||
{
|
{
|
||||||
ARGS2 (a1, a2);
|
ARGS2 (x, y);
|
||||||
RETURN (SCM_BOOL (SCM_EQ_P (a1, a2)));
|
RETURN (SCM_BOOL (SCM_EQ_P (x, y)));
|
||||||
}
|
}
|
||||||
|
|
||||||
VM_DEFINE_FUNCTION (not_eq, "not-eq?", 2)
|
VM_DEFINE_FUNCTION (not_eq, "not-eq?", 2)
|
||||||
{
|
{
|
||||||
ARGS2 (a1, a2);
|
ARGS2 (x, y);
|
||||||
RETURN (SCM_BOOL (!SCM_EQ_P (a1, a2)));
|
RETURN (SCM_BOOL (!SCM_EQ_P (x, y)));
|
||||||
}
|
}
|
||||||
|
|
||||||
VM_DEFINE_FUNCTION (nullp, "null?", 1)
|
VM_DEFINE_FUNCTION (nullp, "null?", 1)
|
||||||
{
|
{
|
||||||
ARGS1 (a1);
|
ARGS1 (x);
|
||||||
RETURN (SCM_BOOL (SCM_NULLP (a1)));
|
RETURN (SCM_BOOL (SCM_NULLP (x)));
|
||||||
}
|
}
|
||||||
|
|
||||||
VM_DEFINE_FUNCTION (not_nullp, "not-null?", 1)
|
VM_DEFINE_FUNCTION (not_nullp, "not-null?", 1)
|
||||||
{
|
{
|
||||||
ARGS1 (a1);
|
ARGS1 (x);
|
||||||
RETURN (SCM_BOOL (!SCM_NULLP (a1)));
|
RETURN (SCM_BOOL (!SCM_NULLP (x)));
|
||||||
|
}
|
||||||
|
|
||||||
|
VM_DEFINE_FUNCTION (eqv, "eqv?", 2)
|
||||||
|
{
|
||||||
|
ARGS2 (x, y);
|
||||||
|
if (SCM_EQ_P (x, y))
|
||||||
|
RETURN (SCM_BOOL_T);
|
||||||
|
if (SCM_IMP (x) || SCM_IMP (y))
|
||||||
|
RETURN (SCM_BOOL_F);
|
||||||
|
SYNC_BEFORE_GC ();
|
||||||
|
RETURN (scm_eqv_p (x, y));
|
||||||
|
}
|
||||||
|
|
||||||
|
VM_DEFINE_FUNCTION (equal, "equal?", 2)
|
||||||
|
{
|
||||||
|
ARGS2 (x, y);
|
||||||
|
if (SCM_EQ_P (x, y))
|
||||||
|
RETURN (SCM_BOOL_T);
|
||||||
|
if (SCM_IMP (x) || SCM_IMP (y))
|
||||||
|
RETURN (SCM_BOOL_F);
|
||||||
|
SYNC_BEFORE_GC ();
|
||||||
|
RETURN (scm_equal_p (x, y));
|
||||||
}
|
}
|
||||||
|
|
||||||
VM_DEFINE_FUNCTION (pairp, "pair?", 1)
|
VM_DEFINE_FUNCTION (pairp, "pair?", 1)
|
||||||
{
|
{
|
||||||
ARGS1 (a1);
|
ARGS1 (x);
|
||||||
RETURN (SCM_BOOL (SCM_CONSP (a1)));
|
RETURN (SCM_BOOL (SCM_CONSP (x)));
|
||||||
}
|
}
|
||||||
|
|
||||||
VM_DEFINE_FUNCTION (listp, "list?", 1)
|
VM_DEFINE_FUNCTION (listp, "list?", 1)
|
||||||
{
|
{
|
||||||
ARGS1 (a1);
|
ARGS1 (x);
|
||||||
RETURN (SCM_BOOL (scm_ilength (a1) >= 0));
|
RETURN (SCM_BOOL (scm_ilength (x) >= 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Basic data
|
||||||
|
*/
|
||||||
|
|
||||||
VM_DEFINE_FUNCTION (cons, "cons", 2)
|
VM_DEFINE_FUNCTION (cons, "cons", 2)
|
||||||
{
|
{
|
||||||
ARGS2 (a1, a2);
|
ARGS2 (x, y);
|
||||||
CONS (a1, a1, a2);
|
CONS (x, x, y);
|
||||||
RETURN (a1);
|
RETURN (x);
|
||||||
}
|
}
|
||||||
|
|
||||||
VM_DEFINE_FUNCTION (car, "car", 1)
|
VM_DEFINE_FUNCTION (car, "car", 1)
|
||||||
{
|
{
|
||||||
ARGS1 (a1);
|
ARGS1 (x);
|
||||||
SCM_VALIDATE_CONS (1, a1);
|
SCM_VALIDATE_CONS (1, x);
|
||||||
RETURN (SCM_CAR (a1));
|
RETURN (SCM_CAR (x));
|
||||||
}
|
}
|
||||||
|
|
||||||
VM_DEFINE_FUNCTION (cdr, "cdr", 1)
|
VM_DEFINE_FUNCTION (cdr, "cdr", 1)
|
||||||
{
|
{
|
||||||
ARGS1 (a1);
|
ARGS1 (x);
|
||||||
SCM_VALIDATE_CONS (1, a1);
|
SCM_VALIDATE_CONS (1, x);
|
||||||
RETURN (SCM_CDR (a1));
|
RETURN (SCM_CDR (x));
|
||||||
}
|
}
|
||||||
|
|
||||||
VM_DEFINE_FUNCTION (set_car, "set-car!", 2)
|
VM_DEFINE_FUNCTION (set_car, "set-car!", 2)
|
||||||
{
|
{
|
||||||
ARGS2 (a1, a2);
|
ARGS2 (x, y);
|
||||||
SCM_VALIDATE_CONS (1, a1);
|
SCM_VALIDATE_CONS (1, x);
|
||||||
SCM_SETCAR (a1, a2);
|
SCM_SETCAR (x, y);
|
||||||
RETURN (SCM_UNSPECIFIED);
|
RETURN (SCM_UNSPECIFIED);
|
||||||
}
|
}
|
||||||
|
|
||||||
VM_DEFINE_FUNCTION (set_cdr, "set-cdr!", 2)
|
VM_DEFINE_FUNCTION (set_cdr, "set-cdr!", 2)
|
||||||
{
|
{
|
||||||
ARGS2 (a1, a2);
|
ARGS2 (x, y);
|
||||||
SCM_VALIDATE_CONS (1, a1);
|
SCM_VALIDATE_CONS (1, x);
|
||||||
SCM_SETCDR (a1, a2);
|
SCM_SETCDR (x, y);
|
||||||
RETURN (SCM_UNSPECIFIED);
|
RETURN (SCM_UNSPECIFIED);
|
||||||
}
|
}
|
||||||
|
|
||||||
VM_DEFINE_FUNCTION (list, "list", -1)
|
VM_DEFINE_FUNCTION (list, "list", -1)
|
||||||
{
|
{
|
||||||
ARGSN (an);
|
ARGSN (n);
|
||||||
POP_LIST (an);
|
POP_LIST (n);
|
||||||
NEXT;
|
NEXT;
|
||||||
}
|
}
|
||||||
|
|
||||||
VM_DEFINE_FUNCTION (vector, "vector", -1)
|
VM_DEFINE_FUNCTION (vector, "vector", -1)
|
||||||
{
|
{
|
||||||
ARGSN (an);
|
ARGSN (n);
|
||||||
POP_LIST (an);
|
POP_LIST (n);
|
||||||
|
SYNC_BEFORE_GC ();
|
||||||
*sp = scm_vector (*sp);
|
*sp = scm_vector (*sp);
|
||||||
NEXT;
|
NEXT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Numeric relational tests
|
||||||
|
*/
|
||||||
|
|
||||||
|
#undef REL
|
||||||
|
#define REL(crel,srel) \
|
||||||
|
{ \
|
||||||
|
ARGS2 (x, y); \
|
||||||
|
if (SCM_INUMP (x) && SCM_INUMP (y)) \
|
||||||
|
RETURN (SCM_BOOL (SCM_INUM (x) crel SCM_INUM (y))); \
|
||||||
|
RETURN (srel (x, y)); \
|
||||||
|
}
|
||||||
|
|
||||||
|
VM_DEFINE_FUNCTION (ee, "ee?", 2)
|
||||||
|
{
|
||||||
|
REL (==, scm_num_eq_p);
|
||||||
|
}
|
||||||
|
|
||||||
|
VM_DEFINE_FUNCTION (lt, "lt?", 2)
|
||||||
|
{
|
||||||
|
REL (<, scm_less_p);
|
||||||
|
}
|
||||||
|
|
||||||
|
VM_DEFINE_FUNCTION (le, "le?", 2)
|
||||||
|
{
|
||||||
|
REL (<=, scm_leq_p);
|
||||||
|
}
|
||||||
|
|
||||||
|
VM_DEFINE_FUNCTION (gt, "gt?", 2)
|
||||||
|
{
|
||||||
|
REL (>, scm_gr_p);
|
||||||
|
}
|
||||||
|
|
||||||
|
VM_DEFINE_FUNCTION (ge, "ge?", 2)
|
||||||
|
{
|
||||||
|
REL (>=, scm_geq_p);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Numeric functions
|
||||||
|
*/
|
||||||
|
|
||||||
|
#undef FUNC1
|
||||||
|
#define FUNC1(CEXP,SEXP) \
|
||||||
|
{ \
|
||||||
|
ARGS1 (x); \
|
||||||
|
if (SCM_INUMP (x)) \
|
||||||
|
{ \
|
||||||
|
int n = CEXP; \
|
||||||
|
if (SCM_FIXABLE (n)) \
|
||||||
|
RETURN (SCM_MAKINUM (n)); \
|
||||||
|
} \
|
||||||
|
RETURN (SEXP); \
|
||||||
|
}
|
||||||
|
|
||||||
|
#undef FUNC2
|
||||||
|
#define FUNC2(CFUNC,SFUNC) \
|
||||||
|
{ \
|
||||||
|
ARGS2 (x, y); \
|
||||||
|
if (SCM_INUMP (x) && SCM_INUMP (y)) \
|
||||||
|
{ \
|
||||||
|
int n = SCM_INUM (x) CFUNC SCM_INUM (y); \
|
||||||
|
if (SCM_FIXABLE (n)) \
|
||||||
|
RETURN (SCM_MAKINUM (n)); \
|
||||||
|
} \
|
||||||
|
RETURN (SFUNC (x, y)); \
|
||||||
|
}
|
||||||
|
|
||||||
|
VM_DEFINE_FUNCTION (add, "add", 2)
|
||||||
|
{
|
||||||
|
FUNC2 (+, scm_sum);
|
||||||
|
}
|
||||||
|
|
||||||
|
VM_DEFINE_FUNCTION (sub, "sub", 2)
|
||||||
|
{
|
||||||
|
FUNC2 (-, scm_difference);
|
||||||
|
}
|
||||||
|
|
||||||
|
VM_DEFINE_FUNCTION (mul, "mul", 2)
|
||||||
|
{
|
||||||
|
ARGS2 (x, y);
|
||||||
|
RETURN (scm_product (x, y));
|
||||||
|
}
|
||||||
|
|
||||||
|
VM_DEFINE_FUNCTION (div, "div", 2)
|
||||||
|
{
|
||||||
|
ARGS2 (x, y);
|
||||||
|
RETURN (scm_divide (x, y));
|
||||||
|
}
|
||||||
|
|
||||||
|
VM_DEFINE_FUNCTION (quo, "quo", 2)
|
||||||
|
{
|
||||||
|
ARGS2 (x, y);
|
||||||
|
RETURN (scm_quotient (x, y));
|
||||||
|
}
|
||||||
|
|
||||||
|
VM_DEFINE_FUNCTION (rem, "rem", 2)
|
||||||
|
{
|
||||||
|
ARGS2 (x, y);
|
||||||
|
RETURN (scm_remainder (x, y));
|
||||||
|
}
|
||||||
|
|
||||||
|
VM_DEFINE_FUNCTION (mod, "mod", 2)
|
||||||
|
{
|
||||||
|
ARGS2 (x, y);
|
||||||
|
RETURN (scm_modulo (x, y));
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Local Variables:
|
Local Variables:
|
||||||
c-file-style: "gnu"
|
c-file-style: "gnu"
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue