From: Keith Packard Date: Wed, 16 Nov 2016 04:22:54 +0000 (-0800) Subject: altos/lisp: Take advantage of multi-arg macros. Add more ROM funcs X-Git-Tag: 1.7~156 X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=commitdiff_plain;h=ac0f7768659e288338bf452b4248ae3572ea2f7d altos/lisp: Take advantage of multi-arg macros. Add more ROM funcs Added nth, or and and. Signed-off-by: Keith Packard --- diff --git a/src/lisp/ao_lisp_const.lisp b/src/lisp/ao_lisp_const.lisp index 9d8af588..4dc63bbf 100644 --- a/src/lisp/ao_lisp_const.lisp +++ b/src/lisp/ao_lisp_const.lisp @@ -1,14 +1,21 @@ - ; basic list accessors - - -(setq cadr (lambda (l) (car (cdr l)))) -(setq caddr (lambda (l) (car (cdr (cdr l))))) -(setq list (lexpr (l) l)) - - ; evaluate a list of sexprs - -;(setq progn (lexpr (l) (last l))) - +; +; Copyright © 2016 Keith Packard +; +; 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 of the License, 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. +; +; Lisp code placed in ROM + + ; return a list containing all of the arguments + +(set (quote list) (lexpr (l) l)) ; ; Define a variable without returning the value @@ -16,22 +23,82 @@ ; having lots of output generated ; -(setq def (macro (def-param) +(setq def (macro (name val rest) (list 'progn (list 'set - (list - 'quote - (car def-param)) - (cadr def-param) - ) + (list 'quote name) + val) + (list 'quote name) + ) + ) + ) + + ; + ; A slightly more convenient form + ; for defining lambdas. + ; + ; (defun () s-exprs) + ; + +(def defun (macro (name args exprs) (list - 'quote - (car def-param) + def + name + (list + 'lambda + args + (cond ((cdr exprs) + (cons progn exprs)) + ((car exprs)) + ) + ) ) ) + ) + ; basic list accessors + + +(defun cadr (l) (car (cdr l))) + +(defun caddr (l) (car (cdr (cdr l)))) + +(defun nth (list n) + (cond ((= n 0) (car list)) + ((nth (cdr list) (1- n))) + ) + ) + + ; simple math operators + +(defun 1+ (x) (+ x 1)) +(defun 1- (x) (- x 1)) + + ; boolean operators + +(def or (lexpr (l) + (let ((ret nil)) + (while l + (cond ((setq ret (car l)) + (setq l nil)) + ((setq l (cdr l))))) + ret ) + ) + ) + +(def and (lexpr (l) + (let ((ret t)) + (while l + (cond ((setq ret (car l)) + (setq l (cdr l))) + ((setq ret (setq l nil))) + ) + ) + ret + ) + ) ) ; define a set of local @@ -52,8 +119,8 @@ ; ; (let ((x 1) (y)) (setq y (+ x 1)) y) -(def let (macro (let-param) - ((lambda (vars exprs make-names make-exprs make-nils) +(def let (macro (vars exprs) + ((lambda (make-names make-exprs make-nils) (progn ; @@ -67,12 +134,12 @@ ) ) ) - ; + ; the set of expressions is ; the list of set expressions ; pre-pended to the ; expressions to evaluate - ; + (setq make-exprs (lambda (vars exprs) (progn (cond (vars (cons @@ -90,20 +157,22 @@ ) ) ) - (setq exprs (make-exprs vars exprs)) - ; ; the parameters to the lambda is a list ; of nils of the right length - ; + (setq make-nils (lambda (vars) (cond (vars (cons nil (make-nils (cdr vars)))) ) ) ) - ; + ; prepend the set operations + ; to the expressions + + (setq exprs (make-exprs vars exprs)) + ; build the lambda. - ; + (cons (list 'lambda @@ -116,8 +185,6 @@ ) ) ) - (car let-param) - (cdr let-param) () () () @@ -125,38 +192,9 @@ ) ) - ; - ; A slightly more convenient form - ; for defining lambdas. - ; - ; (defun () s-exprs) - ; + ; run the let macro once to + ; evaluate all of the internal + ; macro calls -(def defun (macro (defun-param) - (let ((name (car defun-param)) - (args (cadr defun-param)) - (exprs (cdr (cdr defun-param)))) - (list - def - name - (list - 'lambda - args - (cond ((cdr exprs) - (cons progn exprs)) - ((car exprs)) - ) - ) - ) - ) - ) - ) - - ; simple math operators - ; - ; Do these last to run defun - ; at least once so the let macro - ; is resolved +(let ((let-param 1))) -(defun 1+ (x) (+ x 1)) -(defun 1- (x) (- x 1))