Blame doc/minilisp/minilisp.in

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")