Macro Expansions

A.0.1  Supplied macros

The following included forms are all macros. If you supply the 'dont-expand option to sassy, these forms will not be available.

<
<=
>
>=
=
!=
zero?
asciiz
alt
times
until
cs:
ds:
ss:
es:
fs:
gs:
_global_offset_table_
get-got
got-offset
got
plt
sym
even?
odd?
positive?
negative?
when
unless
if3
cond
load
link-expand
link
dynamic-link
auto-link

A.0.2  Comparisons

(<  a b)  => (seq (cmp a b) l!)
(<= a b)  => (seq (cmp a b) le!)
(>  a b)  => (seq (cmp a b) g!)
(>= a b)  => (seq (cmp a b) ge!)
(=  a b)  => (seq (cmp a b) e!)
(!= a b)  => (seq (cmp a b) ne!)
(zero? a) => (seq (test a a) z!)

A.0.3  More Control Primitives

Though these are described in The Text Section as control “primitives,” they are actually macros.

(alt a b ...) => (inv (seq (inv a)
                           (inv b)
                           ...))

(times n e)   => (begin e e ...) ; There will be n e's

(until test body) => (while (inv test) body)

A.0.4  ELF helpers

_global_offset_table => _GLOBAL_OFFSET_TABLE_ ; an uppercase symbol

get-got => (seq (call $eip)
                (pop ebx)
                (add ebx (reloc gotpc the-got 3))

(got-offset symbol values ...) => (reloc gotoff symbol (! (+ 0 values ...)))
(got symbol) => (reloc got32 symbol)
(plt symbol) => (reloc plt32 symbol)
(sym symbol) => (reloc sym32 symbol)

A.0.5  Explicit Continuation Versions

The following macros use only explicit continuations to express the semantics of the primitives seq, if, inv, and begin. They are included in the documentation for elucidation, but are not part of Sassy’s core set of macros:

(macro seq-k (lambda tests
	       (cond ((null? tests) '$win)
		     ((null? (cdr tests)) (car tests))
		     (else `(with-win (seq-k ,@(cdr tests))
			      ,(car tests))))))

(macro inv-k (lambda (itm)
	       `(with-win-lose $lose $win
		  ,itm)))

(macro if-k (lambda (test conseq altern)
	      `(with-win-lose ,conseq ,altern
		 ,test)))

(macro begin-k (lambda body-tail
		 (if (null? (cdr body-tail))
		     (car body-tail)
		     `(with-win (begin-k ,@(cdr body-tail))
			(with-lose $win
			  ,(car body-tail))))))