Changeset 8609 for lang/elisp

Show
Ignore:
Timestamp:
04/01/08 21:44:19 (8 months ago)
Author:
lieutar
Message:

/lang/elisp/escm/trunk: I created debugging mode on my scheme VM.

Location:
lang/elisp/escm/trunk
Files:
3 added
13 modified

Legend:

Unmodified
Added
Removed
  • lang/elisp/escm/trunk/DEVELOPERSTOOLS.el

    r8323 r8609  
    11(let ((dir (file-name-directory (buffer-file-name)))) 
    22  (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  
    2626 
    2727;;; Code: 
    28 (require 'escm-util) 
    29 (require 'escm-cbos) 
    30 (require 'escm-test) 
     28(require 'escm-base) 
    3129;;(require 'escm-env) 
    3230 
    33 (escm-cbos::define-class (escm-arity) 
     31(escm-cbos::define-class (escm-arity escm-object) 
    3432                         length 
    3533                         symbols 
     
    6462    (while (> p 0) 
    6563      (if (and at-least (= p 1)) 
    66           (escm-env::push env (cdr args)) 
     64          (escm-env::push env args) 
    6765        (escm-env::push env (car args))) 
    6866      (setq p    (1- p)) 
     
    7068 
    7169(provide 'escm-arity) 
     70 
     71 
    7272 
    7373 
  • lang/elisp/escm/trunk/escm-cbos.el

    r8322 r8609  
    3535   (escm-cbos::error::no-such-method "No such method"))) 
    3636 
    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) 
    3940 
    4041(defsubst escm-cbos::classp (sym) 
     
    7879 
    7980(defmacro escm-cbos::define-method (class name args &rest body) 
    80   "defines method of escm-cbos objects."   
     81  "defines method of escm-cbos objects."    
    8182  `(progn 
    8283     ,(when t;;(not (fboundp 'name)) 
    8384        `(defsubst ,name (*object* &rest args) 
    8485           (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))) 
    8794          (escm-cbos::expand-method ',args ',body)) 
     95        ) 
    8896     ',name)) 
    8997(put 'escm-cbos::define-method 'lisp-indent-function 'defun) 
     
    111119  (let* ((class (escm-cbos::get-class obj)) 
    112120         (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)))))) 
    117129 
    118130 
     
    141153    new)) 
    142154 
     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 
    143173(defmacro escm-cbos::define-class (inhspec &rest fields) 
    144174  "Creates object constructor and predicate and field-accessors. 
     
    154184  (let* ((name      (car inhspec)) 
    155185         (super     (or (cadr inhspec) 'escm-cbos::Object)) 
    156          (copy-mode (caddr inhspec)) 
    157186         (fields    (escm-cbos::register-class name super fields)) 
    158187         (len       (length fields)) 
     
    168197 
    169198       ,@(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))))) 
    191203 
    192204(defface  escm-cbos::report-section-face 
     
    227239          `(face escm-cbos::report-section-face 
    228240            "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        ") 
    231245                       "\n") 
    232246            "methods:" 
     
    278292  (equal a b)) 
    279293 
    280  
     294(escm-cbos::define-method nil escm-cbos::stringify (self) 
     295  (format "#<normal : %S>" self)) 
    281296 
    282297(escm-cbos::define-method 
    283298  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;;;;;;;;;;;;;;;;;;;; 
    286303(escm-test::define-test escm-cbos escm-cbos 
    287304  (escm-test classp-0 (escm-cbos::classp 'escm-cbos::Object)) 
     
    303320                    (escm-test::p 'inheritance-list-1 
    304321                                  (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  )) 
    306337;;(escm-test::run 'escm-cbos 'escm-cbos) 
    307338 
  • lang/elisp/escm/trunk/escm-compile.el

    r8322 r8609  
    2727;;; Code: 
    2828 
    29  
    30 (require 'escm-cbos  ) 
     29(require 'escm-base  ) 
    3130(require 'escm-syntax) 
    3231(require 'escm-icode ) 
    3332(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 
    5035 
    5136(defun escm-compile (context sexp) 
     
    6954                    ,(escm-context::get-env context))))) 
    7055   (t              (escm-icode `((store  ,sexp)))))) 
    71  
    7256;;(escm-vm::eval (escm-vm::new) '(+ 1 2)) 
     57 
    7358 
    7459;;; test code 
     
    8873    (escm-test::p 'built (escm-iproc::build (escm-compile context 'a))))) 
    8974;; (escm-test::run 'escm 'escm-compile-atom) 
    90  
    91  
    92  
    93  
    94  
    9575 
    9676(defsubst escm-compile-apply (context sexp) 
     
    9979        (tail        (cdr sexp)) 
    10080        (arg-context (escm-context::set-tail? context nil)) 
    101         (ret         (escm-iproc::new ()))) 
     81        (ret         (escm-icode '((push 1))))) 
    10282    (mapcar (lambda (x) 
    10383              (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) 
    10585    (escm-iproc::merge ret (escm-compile 
    10686                            (escm-context::set-func? context t)  head)) 
     
    11393  (let* ((root    (escm-root-env::new)) 
    11494         (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))))) 
    122110    (escm-test::p 'icode (escm-iproc::to-string r)) 
    123111    (escm-test::p 'icode (escm-iproc::to-string ex)) 
     
    156144(defsubst escm-compile-if (context sexp) 
    157145  "" 
    158  (let ((condx     (escm-compile context (cadr   sexp))) 
     146 (let ((condx     (escm-compile (escm-context::set-tail? context nil) (cadr   sexp))) 
    159147       (positivex (escm-compile context (caddr  sexp))) 
    160148       (negativex (escm-compile context (cadddr sexp)))) 
     
    167155 
    168156         (t (escm-compile-if::with-jump context condx positivex negativex))))) 
     157 
    169158 
    170159;;; 
     
    207196 
    208197(defun escm-compile-define-syntax (context sexp) 
    209   "" 
    210198  (let ((name (cadr  sexp)) 
    211199        (proc (caddr sexp))) 
     
    230218    ret)) 
    231219 
    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)))) 
    251240 
    252241(defun escm-compile-lambda (context sexp) 
    253242  "" 
    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))))) 
    264244;;; 
    265245(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 
    267266;; 
    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) 
    269305 
    270306 
     
    301337 
    302338 
     339 
     340 
    303341(provide 'escm-compile) 
    304342;;; 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: 
    528 
    629(defconst escm-env::class-diagram nil " 
    730 
    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. 
    3056 
    3157") 
    3258 
    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)) 
    3463 
    3564(escm-cbos::define-method escm-env escm-env::to-string (self) 
    36   (format "<%s %S>" 
     65  (format "#<%s|%S>" 
    3766          (escm-cbos::get-class self) 
    3867          (escm-env::get-fields self))) 
     
    5281   (escm-env::get-fields b))) 
    5382 
    54  
    5583(escm-cbos::define-method escm-env escm-env::fref (self sym) 
    56   "" 
    57   (escm-cbos::gref self sym)) 
     84  (escm-env::gref self sym)) 
    5885 
    5986(escm-cbos::define-method escm-env escm-env::member? (self sym) 
    60   "" 
    6187  (plist-member (symbol-plist (escm-env::get-dic self)) sym)) 
    6288 
    6389(escm-cbos::define-method escm-env escm-env::pos (self sym) 
    64   "" 
    6590  (get (escm-env::get-dic self) sym)) 
    6691 
     
    6994                                  'escm-env::define))) 
    7095 
    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) 
    7498  ""