Mercurial > hg > xemacs-beta
diff lisp/tooltalk/tooltalk-macros.el @ 0:376386a54a3c r19-14
Import from CVS: tag r19-14
author | cvs |
---|---|
date | Mon, 13 Aug 2007 08:45:50 +0200 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/tooltalk/tooltalk-macros.el Mon Aug 13 08:45:50 2007 +0200 @@ -0,0 +1,92 @@ +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; Date: Wed Dec 16 17:40:58 1992 +;;; File: tooltalk-macros.el +;;; Title: Useful macros for ToolTalk/elisp interface +;;; SCCS: @(#)tooltalk-macros.el 1.5 21 Jan 1993 19:09:24 +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defmacro destructuring-bind-tooltalk-message (variables + args-count + message + &rest body) + " +arglist: (variables args-count message &rest body) + +Binds VARIABLES to the ARG_VALs and ARG_IVALs of MESSAGE, +starting from N = 0, and executes BODY in that context. +Binds actual number of message args to ARGS-COUNT. + +VARIABLES is a list of local variables to bind. +Each item in VARIABLES is either nil, a symbol, or a list of the form: + + (symbol type) + +If the item is nil, the nth ARG_VAL or ARG_IVAL of MESSAGE is skipped. +If the item is a symbol, the nth ARG_VAL of MESSAGE is bound. +If the item is a list + If type = \"int\" the nth ARG_IVAL of MESSAGE is bound, + otherwise the nth ARG_VAL of MESSAGE is bound. + +If there are more items than actual arguments in MESSAGE, the extra +items are bound to nil. + +For example, + +(destructuring-bind-tooltalk-message (a (b \"int\") nil d) foo msg + x y z) + +expands to + +(let* ((foo (get-tooltalk-message-attribute msg 'args_count)) + (a (if (< 0 foo) + (get-tooltalk-message-attribute msg 'arg_val 0))) + (b (if (< 1 foo) + (get-tooltalk-message-attribute msg 'arg_val 1))) + (d (if (< 3 foo) + (get-tooltalk-message-attribute msg 'arg_val 3)))) + x y z) + +See GET-TOOLTALK-MESSAGE-ATTRIBUTE for more information. +" + (let* ((var-list variables) + (nargs args-count) + (msg message) + (n -1) + var-item + var + type + request + bindings) + (setq bindings (cons + (list nargs + (list + 'get-tooltalk-message-attribute + msg + ''args_count)) + bindings)) + (while var-list + (setq var-item (car var-list) + var-list (cdr var-list)) + (if (eq 'nil var-item) + (setq n (1+ n)) + (progn + (if (listp var-item) + (setq var (car var-item) + type (car (cdr var-item))) + (setq var var-item + type "string")) + (setq n (1+ n)) + (setq request (list + 'get-tooltalk-message-attribute + msg + (if (equal "int" type) + ''arg_ival + ''arg_val) + n)) + (setq bindings (cons + (list var + (list 'if + (list '< n nargs) + request)) + bindings))))) + (nconc (list 'let* (nreverse bindings)) body)))