Changeset 8609 for lang/elisp
- Timestamp:
- 04/01/08 21:44:19 (8 months ago)
- Location:
- lang/elisp/escm/trunk
- Files:
-
- 3 added
- 13 modified
-
DEVELOPERSTOOLS.el (modified) (1 diff)
-
escm-arity.el (modified) (3 diffs)
-
escm-base.el (added)
-
escm-cbos.el (modified) (9 diffs)
-
escm-compile.el (modified) (10 diffs)
-
escm-context.el (added)
-
escm-debug.el (added)
-
escm-env.el (modified) (13 diffs)
-
escm-icode.el (modified) (5 diffs)
-
escm-preprocess.el (modified) (1 diff)
-
escm-proc.el (modified) (4 diffs)
-
escm-syntax.el (modified) (1 diff)
-
escm-util.el (modified) (1 diff)
-
escm-util.minimal.el (modified) (1 diff)
-
escm-vm.el (modified) (8 diffs)
-
escm.el (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
lang/elisp/escm/trunk/DEVELOPERSTOOLS.el
r8323 r8609 1 1 (let ((dir (file-name-directory (buffer-file-name)))) 2 2 (unless (member dir load-path ) 3 (setq load-path (cons dir load-path)))) 3 (setq load-path (cons dir load-path))) 4 (require 'escm) 5 (global-set-key [?\C-c ?e ?a] 'escm-debug::activate) 6 (global-set-key [?\C-c ?e ?d] 'escm-debug::deactivate) 7 (dired (file-name-directory (buffer-file-name)))) 8 9 (when nil 10 11 (escm-vm::eval (escm-vm::new) '(+ 0 1 (* 2 3) 4)) 12 (escm-vm::eval (escm-vm::new) '(if nil 1 2)) 13 14 (escm-vm::eval 15 (escm-vm::new) 16 '((lambda () 17 (define (fact n) (if (= n 1) n (* n (fact (- n 1))))) 18 (fact 3)))) 19 20 (escm-vm::eval 21 (escm-vm::new) 22 '((lambda () 23 (define (fib n) 24 (if (< n 2) 25 1 26 (+ (fib (- n 2)) 27 (fib (- n 1))))) 28 (fib 7)))) 29 30 (escm-vm::eval 31 (escm-vm::new) 32 '((lambda () 33 34 (define (fib-iter a b n) 35 (if (= 0 n) 36 (+ a b) 37 (fib-iter 38 b 39 (+ a b) 40 (- n 1)))) 41 42 (define (fib n) 43 (fib-iter 0 1 n)) 44 45 (fib 32) 46 ))) 47 48 (progn 49 (define (fact n) (if (= n 1) n (* n (- n 1)))) 50 (escm-eval '(fact 5)) 51 ) 52 53 54 ) -
lang/elisp/escm/trunk/escm-arity.el
r7953 r8609 26 26 27 27 ;;; Code: 28 (require 'escm-util) 29 (require 'escm-cbos) 30 (require 'escm-test) 28 (require 'escm-base) 31 29 ;;(require 'escm-env) 32 30 33 (escm-cbos::define-class (escm-arity )31 (escm-cbos::define-class (escm-arity escm-object) 34 32 length 35 33 symbols … … 64 62 (while (> p 0) 65 63 (if (and at-least (= p 1)) 66 (escm-env::push env (cdr args))64 (escm-env::push env args) 67 65 (escm-env::push env (car args))) 68 66 (setq p (1- p)) … … 70 68 71 69 (provide 'escm-arity) 70 71 72 72 73 73 -
lang/elisp/escm/trunk/escm-cbos.el
r8322 r8609 35 35 (escm-cbos::error::no-such-method "No such method"))) 36 36 37 (defconst escm-cbos::class-vmt nil) 38 (defconst escm-cbos::class-fields nil) 37 (defconst escm-cbos::default-method nil) 38 (defconst escm-cbos::class-vmt nil) 39 (defconst escm-cbos::class-fields nil) 39 40 40 41 (defsubst escm-cbos::classp (sym) … … 78 79 79 80 (defmacro escm-cbos::define-method (class name args &rest body) 80 "defines method of escm-cbos objects." 81 "defines method of escm-cbos objects." 81 82 `(progn 82 83 ,(when t;;(not (fboundp 'name)) 83 84 `(defsubst ,name (*object* &rest args) 84 85 (escm-cbos::run-method ',name *object* args))) 85 (put (get 'escm-cbos::class-vmt ',class) ',name 86 ;; (byte-compile (escm-cbos::expand-method ',args ',body))) 86 ,(if (null class) 87 `(put 'escm-cbos::default-method ',name 88 (lambda ,args ,@body) 89 ) 90 `(put 91 (get 'escm-cbos::class-vmt ',class) 92 ',name 93 ;; (byte-compile (escm-cbos::expand-method ',args ',body))) 87 94 (escm-cbos::expand-method ',args ',body)) 95 ) 88 96 ',name)) 89 97 (put 'escm-cbos::define-method 'lisp-indent-function 'defun) … … 111 119 (let* ((class (escm-cbos::get-class obj)) 112 120 (ilist (symbol-value (get 'escm-cbos::class-vmt class))) 113 (meth (escm-cbos::find-method1 'ilist name))) 114 (if meth (apply meth (cons ilist (cons name (cons obj args)))) 115 (signal 'escm-cbos::error::no-such-method 116 (list class name))))) 121 (meth (escm-cbos::find-method1 'ilist name)) 122 dflt ) 123 (cond (meth (apply meth (cons ilist (cons name (cons obj args))))) 124 ((setq dflt (get 'escm-cbos::default-method name)) 125 (apply dflt (cons obj args))) 126 (t 127 (signal 'escm-cbos::error::no-such-method 128 (list class name)))))) 117 129 118 130 … … 141 153 new)) 142 154 155 156 (defun escm-cbos::make-accessor (spec p) 157 (let* ((spec (if (listp spec) spec (list spec))) 158 (f (car spec)) 159 (copy-mode (and (member :copy (cdr spec)) t))) 160 (if copy-mode 161 `(progn 162 (defsubst ,(intern (format "%s::set-%s" name f)) (obj val) 163 (let ((new (escm-cbos::clone obj))) 164 (aset new ,p val) new)) 165 (defsubst ,(intern (format "%s::get-%s" name f)) (obj) 166 (aref obj ,p))) 167 `(progn 168 (defsubst ,(intern (format "%s::set-%s" name f)) (obj val) 169 (aset obj ,p val)) 170 (defsubst ,(intern (format "%s::get-%s" name f)) (obj) 171 (aref obj ,p)))))) 172 143 173 (defmacro escm-cbos::define-class (inhspec &rest fields) 144 174 "Creates object constructor and predicate and field-accessors. … … 154 184 (let* ((name (car inhspec)) 155 185 (super (or (cadr inhspec) 'escm-cbos::Object)) 156 (copy-mode (caddr inhspec))157 186 (fields (escm-cbos::register-class name super fields)) 158 187 (len (length fields)) … … 168 197 169 198 ,@(let ((p 0)) 170 (mapcar 171 (if copy-mode 172 (lambda (f) 173 (setq p (1+ p)) 174 `(progn 175 (defsubst ,(intern (format "%s::set-%s" name f)) (obj val) 176 (let ((new (escm-cbos::clone obj))) 177 (aset new ,p val) 178 new)) 179 (defsubst ,(intern (format "%s::get-%s" name f)) (obj) 180 (aref obj ,p)))) 181 182 (lambda (f) 183 (setq p (1+ p)) 184 `(progn 185 (defsubst ,(intern (format "%s::set-%s" name f)) (obj val) 186 (aset obj ,p val)) 187 (defsubst ,(intern (format "%s::get-%s" name f)) (obj) 188 (aref obj ,p))))) 189 190 fields))))) 199 (mapcar (lambda (f) 200 (escm-cbos::make-accessor 201 f 202 (setq p (1+ p)))) fields))))) 191 203 192 204 (defface escm-cbos::report-section-face … … 227 239 `(face escm-cbos::report-section-face 228 240 "name:" (" " ,(format "%s" class) "\n" ) 229 "fields:" (" ",(mapconcat 'symbol-name 230 (escm-cbos::get-fields-of class) ", ") 241 "fields:" (" ",(mapconcat (lambda (f) 242 (format "%S" f)) 243 (escm-cbos::get-fields-of class) 244 "\n ") 231 245 "\n") 232 246 "methods:" … … 278 292 (equal a b)) 279 293 280 294 (escm-cbos::define-method nil escm-cbos::stringify (self) 295 (format "#<normal : %S>" self)) 281 296 282 297 (escm-cbos::define-method 283 298 escm-cbos::Object escm-cbos::stringify (self) 284 (format "* object : %s *" (escm-cbos::get-class self))) 285 299 (format "#<object : %s>" (escm-cbos::get-class self))) 300 301 302 ;;;;;;;;;;;;;;;;;;;; 286 303 (escm-test::define-test escm-cbos escm-cbos 287 304 (escm-test classp-0 (escm-cbos::classp 'escm-cbos::Object)) … … 303 320 (escm-test::p 'inheritance-list-1 304 321 (escm-cbos::inheritance-list 305 'escm-cbos::test1))))) 322 'escm-cbos::test1)))) 323 324 (escm-cbos::define-class (escm-cbos::test2 nil) 325 (a :copy) 326 b) 327 (let* ((o (create-escm-cbos::test2)) 328 (p (escm-cbos::test2::set-a o 1))) 329 (escm-cbos::test2::set-b o 2) 330 (escm-test "copy0" (escm-cbos::test2-p p)) 331 (escm-test "copy1" (not (eq o p))) 332 (escm-test "copy2" (eq (escm-cbos::test2::get-a o) nil)) 333 (escm-test "copy3" (eq (escm-cbos::test2::get-a p) 1)) 334 (escm-test "copy4" (eq (escm-cbos::test2::get-b o) 2)) 335 (escm-test "copy5" (eq (escm-cbos::test2::get-b p) nil)) 336 )) 306 337 ;;(escm-test::run 'escm-cbos 'escm-cbos) 307 338 -
lang/elisp/escm/trunk/escm-compile.el
r8322 r8609 27 27 ;;; Code: 28 28 29 30 (require 'escm-cbos ) 29 (require 'escm-base ) 31 30 (require 'escm-syntax) 32 31 (require 'escm-icode ) 33 32 (require 'escm-env ) 34 (require 'escm-errors) 35 36 37 (escm-cbos::define-class (escm-context nil t) env vm tail? func? in-qq?) 38 39 (defsubst escm-context::new (env &optional vm) 40 (let ((new (create-escm-context))) 41 (escm-context::set-vm 42 (escm-context::set-env new env) 43 vm))) 44 45 (defsubst escm-context::push (self &optional syms) 46 (escm-context::new 47 (escm-dynamic-env::new 48 (escm-context::get-env self) syms) 49 (escm-context::get-vm self))) 33 (require 'escm-context) 34 50 35 51 36 (defun escm-compile (context sexp) … … 69 54 ,(escm-context::get-env context))))) 70 55 (t (escm-icode `((store ,sexp)))))) 71 72 56 ;;(escm-vm::eval (escm-vm::new) '(+ 1 2)) 57 73 58 74 59 ;;; test code … … 88 73 (escm-test::p 'built (escm-iproc::build (escm-compile context 'a))))) 89 74 ;; (escm-test::run 'escm 'escm-compile-atom) 90 91 92 93 94 95 75 96 76 (defsubst escm-compile-apply (context sexp) … … 99 79 (tail (cdr sexp)) 100 80 (arg-context (escm-context::set-tail? context nil)) 101 (ret (escm-i proc::new ())))81 (ret (escm-icode '((push 1))))) 102 82 (mapcar (lambda (x) 103 83 (escm-iproc::merge ret (escm-compile arg-context x)) 104 (escm-iproc::merge ret (escm-icode '(( pusha))))) tail)84 (escm-iproc::merge ret (escm-icode '((to-arg))))) tail) 105 85 (escm-iproc::merge ret (escm-compile 106 86 (escm-context::set-func? context t) head)) … … 113 93 (let* ((root (escm-root-env::new)) 114 94 (context (escm-context::new root)) 115 (r (escm-compile-apply context '(a b c))) 116 (ex (escm-icode `((ref b ,root) 117 (pusha) 118 (ref c ,root) 119 (pusha) 120 (fref a ,root) 121 (call))))) 95 (r (escm-compile-apply context '(a (b 1) c))) 96 (ex (escm-icode `((push) 97 98 (push) 99 (store 1) 100 (to-arg) 101 (fref b ,root) 102 (call) 103 (to-arg) 104 105 (ref c ,root) 106 (to-arg) 107 108 (fref a ,root) 109 (call))))) 122 110 (escm-test::p 'icode (escm-iproc::to-string r)) 123 111 (escm-test::p 'icode (escm-iproc::to-string ex)) … … 156 144 (defsubst escm-compile-if (context sexp) 157 145 "" 158 (let ((condx (escm-compile context(cadr sexp)))146 (let ((condx (escm-compile (escm-context::set-tail? context nil) (cadr sexp))) 159 147 (positivex (escm-compile context (caddr sexp))) 160 148 (negativex (escm-compile context (cadddr sexp)))) … … 167 155 168 156 (t (escm-compile-if::with-jump context condx positivex negativex))))) 157 169 158 170 159 ;;; … … 207 196 208 197 (defun escm-compile-define-syntax (context sexp) 209 ""210 198 (let ((name (cadr sexp)) 211 199 (proc (caddr sexp))) … … 230 218 ret)) 231 219 232 ;; 233 234 (defun escm-compile-define (context sexp) 235 "" 236 (let* ((spec (cadr sexp)) 237 (env (escm-context::get-env context)) 238 name 239 body 240 ret) 241 (if (listp spec) 242 (progn (setq name (car spec)) 243 (setq body (list 'lambda (cadr spec) (cddr sexp)))) 244 (setq name spec) 245 (setq body (caddr sexp))) 246 (setq ret (escm-compile body)) 247 (escm-env::define env name) 248 (escm-iproc::merge ret (escm-icode `((set! ,name ,env)))))) 249 ;; 250 220 ;;;; 221 222 (defsubst escm-compile-lambda1 (context sexp) 223 (let* ((argspec (cadr sexp)) 224 (body (cddr sexp)) 225 (body-reversed (reverse body)) 226 (last (car body-reversed)) 227 (body-without-last (reverse (cdr body-reversed))) 228 (arity (escm-arity::new argspec)) 229 (proc (escm-iproc::new nil sexp)) 230 (ctx (escm-context::push 231 context (escm-arity::get-symbols arity)))) 232 (mapcar (lambda (sexp) 233 (escm-iproc::merge proc 234 (escm-compile ctx sexp))) 235 body-without-last) 236 (escm-iproc::merge proc 237 (escm-compile (escm-context::set-tail? ctx t) last)) 238 (escm-iproc::merge proc (escm-icode '((ret)))) 239 (escm-iproc::to-proc proc arity (escm-context::get-env ctx)))) 251 240 252 241 (defun escm-compile-lambda (context sexp) 253 242 "" 254 (let* ((argspec (cadr sexp)) 255 (body (cddr sexp)) 256 (arity (escm-arity::new argspec)) 257 (proc (escm-iproc::new nil)) 258 (ctx (escm-context::push 259 context 260 (escm-arity::get-symbols arity)))) 261 (mapcar (lambda (sexp) (escm-iproc::merge proc (escm-compile ctx sexp))) body) 262 (escm-iproc::merge proc (escm-icode '((ret)))) 263 (escm-icode `((store-proc ,(escm-iproc::to-proc proc arity env)))))) 243 (escm-icode `((store-proc ,(escm-compile-lambda1 context sexp))))) 264 244 ;;; 265 245 (escm-test::define-test escm escm-compile-lambda 266 ) 246 (let* ((vm (escm-vm::new)) 247 (context (escm-context::new (escm-vm::current-env vm) vm)) 248 (sexp '(lambda (a b))) 249 (test 250 (lambda (proc) 251 (let ((env (escm-proc::get-env proc))) 252 (escm-test env 253 (equal '(a b) 254 (escm-test::p 255 'env-syms 256 (escm-env::get-fields env)))))))) 257 (escm-test::p 258 "compiled" 259 (escm-iproc::to-string 260 (escm-icode `((store-proc ,(escm-compile-lambda1 context sexp)))))) 261 (funcall test (escm-compile-lambda1 context sexp)) 262 (funcall test (escm-vm::eval vm sexp)))) 263 ;; (escm-test::run 'escm 'escm-compile-lambda) 264 265 267 266 ;; 268 ;;(escm-vm::eval (escm-vm::new) '((lambda () 1))) 267 (defsubst escm-compile-define1 (context sexp) 268 (let* ((spec (cadr sexp))) 269 (if (listp spec) 270 `(,(car spec) (lambda ,(cdr spec) ,@(cddr sexp))) 271 `(, name ,(caddr sexp))))) 272 273 (defun escm-compile-define (context sexp) 274 (let* ((spec (escm-compile-define1 context sexp)) 275 (env (escm-context::get-env context)) 276 (name (car spec)) 277 (body (cadr spec))) 278 (escm-env::define env name) 279 (escm-iproc::merge (escm-compile context body) 280 (escm-icode `((set! ,name ,env) 281 (store ',name)))))) 282 283 (escm-test::define-test escm escm-compile-define 284 (let* ((vm (escm-vm::new)) 285 (context (escm-context::new (escm-vm::current-env vm) vm))) 286 (escm-test "expand to lambda" 287 (equal '(a (lambda (n) n)) 288 (escm-test::p 289 "lambda expantion" 290 (escm-compile-define1 context '(define (a n) n))))) 291 292 (escm-test::p 293 "ex0" 294 (escm-iproc::to-string (escm-compile context '(define (a n) n)))) 295 296 (escm-test::p 297 "ex1" 298 (escm-iproc::to-string (escm-compile context '((lambda (n) (define (a n) n) (a n)) 5)))) 299 300 (escm-test::p 301 "ex2" 302 (escm-iproc::to-string (escm-compile context '((lambda () (define (a n) n) (a 5)))))) 303 )) 304 ;;; (escm-test::run 'escm 'escm-compile-define) 269 305 270 306 … … 301 337 302 338 339 340 303 341 (provide 'escm-compile) 304 342 ;;; escm-compile.el ends here -
lang/elisp/escm/trunk/escm-env.el
r8322 r8609 1 (require 'escm-util) 2 (require 'escm-cbos) 3 (require 'escm-test) 4 (require 'escm-errors) 1 ;;; escm-env.el --- enviroment for escm runtime. 2 3 ;; Copyright (C) 2008 Free Software Foundation, Inc. 4 5 ;; Author: Zaurus User(require 'escm-base) <zaurus@localhost.localdomain> 6 ;; Keywords: lisp 7 8 ;; This file is free software; you can redistribute it and/or modify 9 ;; it under the terms of the GNU General Public License as published by 10 ;; the Free Software Foundation; either version 2, or (at your option) 11 ;; any later version. 12 13 ;; This file is distributed in the hope that it will be useful, 14 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of 15 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 ;; GNU General Public License for more details. 17 18 ;; You should have received a copy of the GNU General Public License 19 ;; along with GNU Emacs; see the file COPYING. If not, write to 20 ;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 21 ;; Boston, MA 02111-1307, USA. 22 23 ;;; Commentary: 24 25 ;; 26 27 ;;; Code: 5 28 6 29 (defconst escm-env::class-diagram nil " 7 30 8 +--------------+ 9 | escm-env | 10 | <<abstract>> | 11 +--------------+ 12 A 13 | 14 +-------------------+---------------------+ 15 | | | 16 +----------------+ +--------+---------+ +--------+-------+ 17 | escm-fixed-env |<-+ escm-dynamic-env | | escm-elisp-env | 18 +----------------+ -------------------+ +--------+-------+ 19 A | 20 | | 21 +------+--------+ | 22 | escm-root-env |<>----------+ 23 +---------------+ 24 25 escm-env ... abstract root class of escm environment. 26 escm-fixed-env ... runtime environment for any procedures. 27 escm-dynamic-env ... it derives escm-fixed-env. 28 escm-root-env ... 29 escm-elisp-env ... this is able to access to native elisp environment. 31 +--------------+ 32 | escm-env | 33 | <<abstract>> | 34 +--------------+ 35 A 36 | 37 +-------------------+-----+---------------+---------+ 38 | | | | 39 +----------------+ +--------+---------+ +--------+-------+ | 40 | escm-fixed-env |<-+ escm-dynamic-env | | escm-elisp-env | | 41 +----------------+ -------------------+ +--------+-------+ | 42 A | | 43 | | | 44 +------+--------+ | | 45 | escm-root-env |<>----------+ | 46 +---------------+ +-----------+-----------+ 47 | escm-wrapped-proc-env | 48 +-----------------------+ 49 50 escm-env ... abstract root class of escm environment. 51 escm-fixed-env ... runtime environment for any procedures. 52 escm-dynamic-env ... it derives escm-fixed-env. 53 escm-root-env ... environment that exists when vm initialized. 54 escm-elisp-env ... this is able to access to native elisp environment. 55 escm-wrapped-proc-env ... pseudo env for procedure that wrapped elisp function. 30 56 31 57 ") 32 58 33 (escm-cbos::define-class (escm-env) parent dic) 59 (escm-cbos::define-class (escm-env escm-object) parent dic) 60 61 (escm-cbos::define-method escm-env escm-object::to-string (self) 62 (escm-env::to-string self)) 34 63 35 64 (escm-cbos::define-method escm-env escm-env::to-string (self) 36 (format " <%s%S>"65 (format "#<%s|%S>" 37 66 (escm-cbos::get-class self) 38 67 (escm-env::get-fields self))) … … 52 81 (escm-env::get-fields b))) 53 82 54 55 83 (escm-cbos::define-method escm-env escm-env::fref (self sym) 56 "" 57 (escm-cbos::gref self sym)) 84 (escm-env::gref self sym)) 58 85 59 86 (escm-cbos::define-method escm-env escm-env::member? (self sym) 60 ""61 87 (plist-member (symbol-plist (escm-env::get-dic self)) sym)) 62 88 63 89 (escm-cbos::define-method escm-env escm-env::pos (self sym) 64 ""65 90 (get (escm-env::get-dic self) sym)) 66 91 … … 69 94 'escm-env::define))) 70 95 71 72 73 (escm-cbos::define-method escm-env escm-env::make-function-referer (self env sym) 96 (escm-cbos::define-method 97 escm-env escm-env::make-referer (self env sym) 74 98 ""
![(please configure the [header_logo] section in trac.ini)](/share/chrome/site/your_project_logo.png)