|
Packit |
df99a1 |
;; -*- Lisp -*-
|
|
Packit |
df99a1 |
;; ---------------------------------------------------------------
|
|
Packit |
df99a1 |
;; MiniLisp - Very small lisp interpreter to demonstrate MiniExp.
|
|
Packit |
df99a1 |
;; Copyright (c) 2005 Leon Bottou
|
|
Packit |
df99a1 |
;;
|
|
Packit |
df99a1 |
;; This software is subject to, and may be distributed under, the
|
|
Packit |
df99a1 |
;; GNU General Public License, either Version 2 of the license,
|
|
Packit |
df99a1 |
;; or (at your option) any later version. The license should have
|
|
Packit |
df99a1 |
;; accompanied the software or you may obtain a copy of the license
|
|
Packit |
df99a1 |
;; from the Free Software Foundation at http://www.fsf.org .
|
|
Packit |
df99a1 |
;;
|
|
Packit |
df99a1 |
;; This program is distributed in the hope that it will be useful,
|
|
Packit |
df99a1 |
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
df99a1 |
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
Packit |
df99a1 |
;; GNU General Public License for more details.
|
|
Packit |
df99a1 |
;; ---------------------------------------------------------------
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
;; Executable <minilisp> loads this file on startup.
|
|
Packit |
df99a1 |
;; It contains a few helpful minilisp functions and macros.
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
(defvar defun
|
|
Packit |
df99a1 |
(mlambda((name . args) . body)
|
|
Packit |
df99a1 |
(list 'defvar name (list 'lambda args . body)) ) )
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
(defvar defmacro
|
|
Packit |
df99a1 |
(mlambda((name . args) . body)
|
|
Packit |
df99a1 |
(list 'defvar name (list 'mlambda args . body)) ) )
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
(defmacro (pretty f)
|
|
Packit |
df99a1 |
(let ((s (if (symbolp f) (list (list quote f)))))
|
|
Packit |
df99a1 |
(list 'let
|
|
Packit |
df99a1 |
(list (list 's (list 'funcdef f . s)))
|
|
Packit |
df99a1 |
(list 'pprint 's 72)
|
|
Packit |
df99a1 |
() ) ) )
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
(defun (copyrev l)
|
|
Packit |
df99a1 |
(let ((r ()))
|
|
Packit |
df99a1 |
(while l
|
|
Packit |
df99a1 |
(setq r (cons (car l) r))
|
|
Packit |
df99a1 |
(setq l (cdr l)) )
|
|
Packit |
df99a1 |
r ) )
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
(defun (copy l)
|
|
Packit |
df99a1 |
(reverse (copyrev l)) )
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
(defun (append . l)
|
|
Packit |
df99a1 |
(setq l (copyrev l))
|
|
Packit |
df99a1 |
(let ((r (car l)))
|
|
Packit |
df99a1 |
(while (consp (setq l (cdr l)))
|
|
Packit |
df99a1 |
(let ((x (copyrev (car l))))
|
|
Packit |
df99a1 |
(while (consp x)
|
|
Packit |
df99a1 |
(let ((y (cdr x)))
|
|
Packit |
df99a1 |
(setq r (rplacd x r))
|
|
Packit |
df99a1 |
(setq x y) ) ) ) )
|
|
Packit |
df99a1 |
r ) )
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
(defmacro (when cond . body)
|
|
Packit |
df99a1 |
(list 'if cond (list 'progn . body)) )
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
(let ((sym-to '|S 0001|)
|
|
Packit |
df99a1 |
(sym-res '|S 0002|) )
|
|
Packit |
df99a1 |
(defmacro (for (v from to) . body)
|
|
Packit |
df99a1 |
(list 'let (list (list v from)
|
|
Packit |
df99a1 |
(list sym-to to)
|
|
Packit |
df99a1 |
(list sym-res ()) )
|
|
Packit |
df99a1 |
(list 'while (list <= v sym-to)
|
|
Packit |
df99a1 |
(list 'setq sym-res (list 'progn . body))
|
|
Packit |
df99a1 |
(list 'setq v (list '+ v 1)) )
|
|
Packit |
df99a1 |
sym-res ) ) )
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
(let ((sym-to '|S 0001|)
|
|
Packit |
df99a1 |
(sym-res '|S 0002|) )
|
|
Packit |
df99a1 |
(defmacro (mapfor (v from to) . body)
|
|
Packit |
df99a1 |
(list 'let (list (list v from)
|
|
Packit |
df99a1 |
(list sym-to to)
|
|
Packit |
df99a1 |
(list sym-res ()) )
|
|
Packit |
df99a1 |
(list 'while (list <= v sym-to)
|
|
Packit |
df99a1 |
(list 'setq sym-res (list 'cons (list 'progn . body) sym-res))
|
|
Packit |
df99a1 |
(list 'setq v (list '+ v 1)) )
|
|
Packit |
df99a1 |
(list 'reverse sym-res) ) ) )
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
(defmacro (cond . args)
|
|
Packit |
df99a1 |
(let ((a (copyrev args))
|
|
Packit |
df99a1 |
(r ()))
|
|
Packit |
df99a1 |
(while (consp a)
|
|
Packit |
df99a1 |
(setq r (cons 'if (cons (caar a)
|
|
Packit |
df99a1 |
(if (= (length (cdar a)) 1)
|
|
Packit |
df99a1 |
(list (car (cdar a)) r)
|
|
Packit |
df99a1 |
(list (cons 'progn (cdar a)) r) ) )))
|
|
Packit |
df99a1 |
(setq a (cdr a)) )
|
|
Packit |
df99a1 |
r ) )
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
(defmacro (not n)
|
|
Packit |
df99a1 |
(list 'nullp n) )
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
(defmacro (and . args)
|
|
Packit |
df99a1 |
(let ((r 't)
|
|
Packit |
df99a1 |
(a (copyrev args)) )
|
|
Packit |
df99a1 |
(while a
|
|
Packit |
df99a1 |
(setq r (list 'if (car a) r))
|
|
Packit |
df99a1 |
(setq a (cdr a)) )
|
|
Packit |
df99a1 |
r ) )
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
(defmacro (or . args)
|
|
Packit |
df99a1 |
(let ((r ())
|
|
Packit |
df99a1 |
(a (copyrev args))
|
|
Packit |
df99a1 |
(f (mlambda(x . b)
|
|
Packit |
df99a1 |
(list 'let (list (list 's x))
|
|
Packit |
df99a1 |
(list 'if 's 's . b) ) )) )
|
|
Packit |
df99a1 |
(while a
|
|
Packit |
df99a1 |
(setq r (list f (car a) r))
|
|
Packit |
df99a1 |
(setq a (cdr a)) )
|
|
Packit |
df99a1 |
r ) )
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
(defun (mapcar f l)
|
|
Packit |
df99a1 |
(let ((r ()))
|
|
Packit |
df99a1 |
(while l
|
|
Packit |
df99a1 |
(setq r (cons (f (car l)) r))
|
|
Packit |
df99a1 |
(setq l (cdr l)) )
|
|
Packit |
df99a1 |
(reverse r) ) )
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
(defun (1+ x) (+ x 1))
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
(defun (1- x) (- x 1))
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
(defun (2* x) (* x 2))
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
(defun (2/ x) (/ x 2))
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
(defun (div n d)
|
|
Packit |
df99a1 |
(floor (/ n d)) )
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
(defun (mod n d)
|
|
Packit |
df99a1 |
(- n (* d (div n d))) )
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
(defvar set! setq)
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
(defvar set-car! rplaca)
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
(defvar set-cdr! rplacd)
|
|
Packit |
df99a1 |
|
|
Packit |
df99a1 |
(display "MiniLisp, (C) 2005, Leon Bottou.\n"
|
|
Packit |
df99a1 |
"Available under the GNU General Public Licence.\n\n")
|