In any case, ~with-lazy and force~ are not defined.
> […]
> Any ideas? Did I make some kind of stupidly obvious mistake?
Yes. You're expanding a symbol macro to an expression that contains
itself, so it is an infinite expansion.
(ql:quickload :com.informatimago.common-lisp)
(use-package :com.informatimago.common-lisp.lisp-sexp.source-form)
(defun split-args (lambda-list)
(flet ((names (ps) (mapcar (function parameter-name) ps)))
(let ((ll (parse-lambda-list lambda-list)))
(values (names (lambda-list-mandatory-parameters ll))
(names (lambda-list-optional-parameters ll))
(and (lambda-list-rest-parameter-p ll)
(parameter-name (lambda-list-rest-parameter ll)))
(names (lambda-list-keyword-parameters ll))))))
;; (split-args '(a &optional b &rest r &key ((:k kv))))
;; (split-args '())
(defun force~ (x) x)
(defmacro with-lazy~ (args expr)
(multiple-value-bind (req opt rest key) (split-args args)
(let* ((parameter-names (append req opt key (when rest (list rest))))
(parameter-temps (mapcar (lambda (x) (gensym (string x)))
parameter-names)))
`(let ,(mapcar (function list) parameter-temps parameter-names)
(symbol-macrolet (,@(append (mapcar (lambda (arg temp)
`(,arg (force~ ,temp)))
(append req opt key)
(append parameter-temps))
(when rest
(list `(,rest (mapcar #'force~ ,(car (last parameter-temps))))))) )
,expr)))))
(defmacro defun~ (name args expr)
`(defun ,name ,args
(with-lazy~ ,args
,expr)))
(defmacro ~defun (name args expr)
`(defun ,name ,args
(with-lazy~ ,args
,expr)))
(defun~ funcall~ (fn &rest args)
(apply #'funcall
fn args))
;; before:
(pprint (macroexpand '(with-lazy~ (a &optional b &rest r &key ((:k kv)))
(list a b r k))))
(symbol-macrolet ((a (force~ a))
(b (force~ b))
(kv (force~ kv))
(r (mapcar #'force~ r)))
(list a b r k))
t
;; after:
(pprint (macroexpand '(with-lazy~ (a &optional b &rest r &key ((:k kv)))
(list a b r k))))
(let ((#1=#:a68726 a) (#2=#:b68727 b) (#3=#:kv68728 kv) (#4=#:r68729 r))
(symbol-macrolet
((a (force~ #1#)) (b (force~ #2#)) (kv (force~ #3#)) (r (mapcar #'force~ #4#)))
(list a b r k)))
t
--
__Pascal Bourguignon__
http://www.informatimago.com/