www

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

commit 820a452dbf29886f3b651d449f2e2cdab46fcc71
parent 5277544ada79e632afb328dcdf5e414e579bbc73
Author: Bertrand BRUN <bertrand.brun@me.com>
Date:   Fri,  5 Nov 2010 11:34:50 +0100

Ajout du curry pour manger

Diffstat:
Mlisp2li.lisp | 18++++++++++++++----
Mmeval.lisp | 1-
Mutil.lisp | 29+++++++++++++++++++++++++++++
3 files changed, 43 insertions(+), 5 deletions(-)

diff --git a/lisp2li.lisp b/lisp2li.lisp @@ -40,7 +40,7 @@ par le compilateur et par l’interpréteur" (lisp2li (third expr) env-var env-fun) (lisp2li (fourth expr) env-var env-fun))) ;; quotes - ((eq 'quote (car expr)) + ((eq 'quote (car expr)) (cons :lit (second expr))) ;; defun ((eq 'defun (car expr)) @@ -62,8 +62,8 @@ par le compilateur et par l’interpréteur" (body (cddr expr))) (lisp2li `((lambda ,(mapcar #'car bindings) ,@body) - ,@(mapcar #'cadr bindings)) env-var env-fun))) - ;; let* + ,@(mapcar #'cadr bindings)) env-var env-fun))) + ;; let* ((eq 'let* (car expr)) (let ((bindings (cadr expr)) (body (caddr expr))) @@ -72,6 +72,16 @@ par le compilateur et par l’interpréteur" `(let (,(car bindings)) (let* ,(cdr bindings) ,body))) env-var env-fun))) + ;; labels + ((eq 'labels (car expr)) + (let ((bindings (cadr expr)) + (body (cddr expr))) + (lisp2li `((lambda ,(mapcar #'car bindings) + ,@body) + ,@(mapcar #'cadr bindings)) env-var env-fun))) + ;; ` + ((eq '` (car expr)) + (print "Ca marche")) ;; progn ((eq 'progn (car expr)) (cons :progn (map-lisp2li (cdr expr) env-var env-fun))) @@ -86,7 +96,7 @@ par le compilateur et par l’interpréteur" )) (defun map-lisp2li (expr env-var env-fun) - (mapcar (lambda (x) (lisp2li x env-var env-fun)) expr)) + (mapcar (curry #'lisp2li :skip env-var env-fun) expr)) (defun map-lisp2li-let (expr env) (mapcar (lambda (x) (add-binding env (car x) (lisp2li (cadr x) env))) (cadr expr))) diff --git a/meval.lisp b/meval.lisp @@ -17,7 +17,6 @@ (defun map-meval (list env) (mapcar (lambda (x) (meval x env)) list)) - (defun foo (x) x) ;; Test unitaire diff --git a/util.lisp b/util.lisp @@ -34,3 +34,31 @@ t (and (consp l) (n-consp (- n 1) (cdr l))))) + +(defun range (a &optional b) + (cond ((null b) (range 0 a)) + ((> a b) (loop for i from a above (- b 1) collect i)) + (T (loop for i from a to b collect i)))) + +(defun shift (n l) + (if (<= n 0) + l + (shift (- n 1) (cdr l)))) + +(defmacro curry (fun &rest params) + `(lambda (&rest actual-params) + (apply ,fun + ,@(mapcar (lambda (x n) + (if (eq :skip x) + `(nth ,(- n 1) actual-params) + x)) + params + (range (length params))) + (shift ,(count-if (lambda (x) (eq x :skip)) params) + actual-params)))) + +(defun foo (x y z) (list x y z)) +(defvar cfoo nil) +(setq cfoo (curry #'foo 1 2)) +(defvar cfoo2 nil) +(setq cfoo2 (curry #'foo :skip 2)) +\ No newline at end of file