1 Language Model
2 Syntactic Forms
3 Datatypes
4 Structures
5 Classes and Objects
6 Units
7 Contracts
8 Pattern Matching
9 Control Flow
10 Concurrency
11 Macros
12 Input and Output
13 Reflection and Security
14 Operating System
15 Memory Management
16 Running PLT Scheme
Bibliography
Index
On this page:
syntax-property
syntax-property-symbol-keys
syntax-track-origin
Version: 4.0.2

 

11.6 Syntax Object Properties

Every syntax object has an associated syntax property list, which can be queried or extended with syntax-property. Properties are not preserved for a syntax-quoted syntax object in a compiled form that is marshaled to a byte string.

In read-syntax, the reader attaches a 'paren-shape property to any pair or vector syntax object generated from parsing a pair [ and ] or { and }; the property value is #\[ in the former case, and #\{ in the latter case. The syntax form copies any 'paren-shape property from the source of a template to corresponding generated syntax.

Both the syntax input to a transformer and the syntax result of a transformer may have associated properties. The two sets of properties are merged by the syntax expander: each property in the original and not present in the result is copied to the result, and the values of properties present in both are combined with cons (result value first, original value second).

Before performing the merge, however, the syntax expander automatically adds a property to the original syntax object using the key 'origin. If the source syntax has no 'origin property, it is set to the empty list. Then, still before the merge, the identifier that triggered the macro expansion (as syntax) is consed onto the 'origin property so far. The 'origin property thus records (in reverse order) the sequence of macro expansions that produced an expanded expression. Usually, the 'origin value is an immutable list of identifiers. However, a transformer might return syntax that has already been expanded, in which case an 'origin list can contain other lists after a merge. The syntax-track-origin procedure implements this tracking.

Besides 'origin tracking for general macro expansion, MzScheme adds properties to expanded syntax (often using syntax-track-origin) to record additional expansion details:

See Information on Expanded Modules for information about properties generated by the expansion of a module declaration. See lambda and Inferred Value Names for information about properties recognized when compiling a procedure. See current-compile for information on properties and byte codes.

(syntax-property stx key v)  syntax?

  stx : syntax?

  key : any/c

  v : any/c

(syntax-property stx key)  any

  stx : syntax?

  key : any/c

The three-argument form extends stx by associating an arbitrary property value v with the key key; the result is a new syntax object with the association (while stx itself is unchanged).

The two-argument form returns an arbitrary property value associated to stx with the key key, or #f if no value is associated to stx for key.

(syntax-property-symbol-keys stx)  list?

  stx : syntax?

Returns a list of all symbols that as keys have associated properties in stx. Uninterned symbols (see Symbols) are not included in the result list.

(syntax-track-origin

 

new-stx

 

 

 

 

 

 

orig-stx

 

 

 

 

 

 

id-stx)

 

 

any

  new-stx : syntax?

  orig-stx : syntax?

  id-stx : syntax?

Adds properties to new-stx in the same way that macro expansion adds properties to a transformer result. In particular, it merges the properties of orig-stx into new-stx, first adding id-stx as an 'origin property, and it returns the property-extended syntax object. Use the syntax-track-origin procedure in a macro transformer that discards syntax (corresponding to orig-stx with a keyword id-stx) leaving some other syntax in its place (corresponding to new-stx).

For example, the expression

  (or x y)

expands to

  (let ((or-part x)) (if or-part or-part (or y)))

which, in turn, expands to

  (let-values ([(or-part) x]) (if or-part or-part y))

The syntax object for the final expression will have an 'origin property whose value is (list (quote-syntax let) (quote-syntax or)).