[Openmcl-devel] goblock

Taoufik Dachraoui dachraoui.taoufik at gmail.com
Sun Feb 24 05:52:25 PST 2013


I am currently using tagbody as follows:

(defun parse-tagblock (body tags)
  (labels ((%parse (e)
               ((null e) nil)
               ((atom e) e)
               (t (cond
                    ((eq (car e) 'quote) e)
                    ((and (symbolp (car e))
                          (string= (symbol-name (car e)) "TAGBLOCK"))
                     `(block ,(cadr e)
                        (tagbody ,@(parse-tagblock
                                    (cddr e)
                                    (append (loop for a in (cddr e)
                                               when (symbolp a) collect a)
                    ((and (symbolp (car e))
                          (string= (symbol-name (car e)) "GOTO"))
                     (let ((tag (%parse (cadr e))))
                       `(case ,tag
                          ,@(loop for x in tags
                               collect `(,x (go ,x)))
                          (t (error (format nil "Can't Go to ~S" ,tag))))))
                    (t `(,(%parse (car e)) ,@(%parse (cdr e)))))))))

   (%parse body)))

(defmacro tagblock (name &rest args)
  `(block ,name
     (tagbody ,@(parse-tagblock
                 (loop for a in args
                    when (symbolp a) collect a)))))

tagblock works exactly like tagbody with the additions goto and block; this
works even if the tagblocks are nested

The issue is that the goto is basically transformed to a case instruction
and this can be improved by doing an indirect jump as in assembler; for
this reason I explored the possibility to implement this using lap-functions
but unfortunately I do not have enough knwowledge to tackle this for now.

As a first step I implemented the tagblock using funcall and now I am
hoping to find a way to rewrite it using lap-functions and replace funcalls
by an indirect jump

Where can I find a tutorial about lap-functions, I tried to read
compiler/.../nx*.lisp staff but found it difficult to grasp
without any previous knowledge

Kind regards

On Sun, Feb 24, 2013 at 12:35 PM, Pascal J. Bourguignon <
pjb at informatimago.com> wrote:

> Taoufik Dachraoui <dachraoui.taoufik at gmail.com> writes:
> > Hi
> >
> > I needed to have a computed GO in one of my developments
> > I could not use tagbody
> Why can't you use tagbody?
> https://groups.google.com/forum/?fromgroups=#!msg/comp.lang.lisp/wr3ekiLN8sI/NjVkbNRCVMgJ
> --
> __Pascal Bourguignon__                     http://www.informatimago.com/
> A bad day in () is better than a good day in {}.
> _______________________________________________
> Openmcl-devel mailing list
> Openmcl-devel at clozure.com
> http://clozure.com/mailman/listinfo/openmcl-devel
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.clozure.com/pipermail/openmcl-devel/attachments/20130224/533f87d1/attachment.htm>

More information about the Openmcl-devel mailing list