annotate lisp/tooltalk/tooltalk-macros.el @ 143:50e7fedfe353

Added tag r20-2b5 for changeset 1856695b1fa9
author cvs
date Mon, 13 Aug 2007 09:33:20 +0200
parents 376386a54a3c
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2 ;;; Date: Wed Dec 16 17:40:58 1992
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3 ;;; File: tooltalk-macros.el
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4 ;;; Title: Useful macros for ToolTalk/elisp interface
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5 ;;; SCCS: @(#)tooltalk-macros.el 1.5 21 Jan 1993 19:09:24
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8 (defmacro destructuring-bind-tooltalk-message (variables
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9 args-count
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
10 message
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
11 &rest body)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
12 "
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
13 arglist: (variables args-count message &rest body)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
14
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
15 Binds VARIABLES to the ARG_VALs and ARG_IVALs of MESSAGE,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
16 starting from N = 0, and executes BODY in that context.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
17 Binds actual number of message args to ARGS-COUNT.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
18
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
19 VARIABLES is a list of local variables to bind.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
20 Each item in VARIABLES is either nil, a symbol, or a list of the form:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
21
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
22 (symbol type)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
23
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
24 If the item is nil, the nth ARG_VAL or ARG_IVAL of MESSAGE is skipped.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
25 If the item is a symbol, the nth ARG_VAL of MESSAGE is bound.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
26 If the item is a list
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
27 If type = \"int\" the nth ARG_IVAL of MESSAGE is bound,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
28 otherwise the nth ARG_VAL of MESSAGE is bound.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
29
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
30 If there are more items than actual arguments in MESSAGE, the extra
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
31 items are bound to nil.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
32
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
33 For example,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
34
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
35 (destructuring-bind-tooltalk-message (a (b \"int\") nil d) foo msg
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
36 x y z)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
37
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
38 expands to
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
39
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
40 (let* ((foo (get-tooltalk-message-attribute msg 'args_count))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
41 (a (if (< 0 foo)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
42 (get-tooltalk-message-attribute msg 'arg_val 0)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
43 (b (if (< 1 foo)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
44 (get-tooltalk-message-attribute msg 'arg_val 1)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
45 (d (if (< 3 foo)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
46 (get-tooltalk-message-attribute msg 'arg_val 3))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
47 x y z)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
48
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
49 See GET-TOOLTALK-MESSAGE-ATTRIBUTE for more information.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
50 "
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
51 (let* ((var-list variables)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
52 (nargs args-count)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
53 (msg message)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
54 (n -1)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
55 var-item
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
56 var
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
57 type
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
58 request
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
59 bindings)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
60 (setq bindings (cons
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
61 (list nargs
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
62 (list
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
63 'get-tooltalk-message-attribute
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
64 msg
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
65 ''args_count))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
66 bindings))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
67 (while var-list
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
68 (setq var-item (car var-list)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
69 var-list (cdr var-list))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
70 (if (eq 'nil var-item)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
71 (setq n (1+ n))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
72 (progn
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
73 (if (listp var-item)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
74 (setq var (car var-item)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
75 type (car (cdr var-item)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
76 (setq var var-item
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
77 type "string"))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
78 (setq n (1+ n))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
79 (setq request (list
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
80 'get-tooltalk-message-attribute
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
81 msg
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
82 (if (equal "int" type)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
83 ''arg_ival
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
84 ''arg_val)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
85 n))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
86 (setq bindings (cons
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
87 (list var
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
88 (list 'if
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
89 (list '< n nargs)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
90 request))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
91 bindings)))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
92 (nconc (list 'let* (nreverse bindings)) body)))