▼ |  | Unstable: May Change Without Warning

1 | Guidelines for Developing unstable Libraries
2 | Automata: Compiling State Machines
3 | Bytes
4 | Contracts
5 | Contracts for Macro Subexpressions
6 | Debugging
7 | Definitions
8 | Errors
9 | Filesystem
10 | Find
11 | Flonums
12 | Futures
13 | Functions
14 | Hash Tables
15 | Interface-Oriented Programming for Classes
16 | Lazy Require
17 | Lists
18 | Logging
19 | Macro Testing
20 | Mark Parameters
21 | Match
22 | Open place expressions
23 | Options
24 | Parameter Groups
25 | Pretty-Printing
26 | Re-Contracting Identifiers
27 | Sandbox
28 | Sequences
29 | Strings
30 | Structs
31 | Struct Printing
32 | Syntax
33 | Temporal Contracts: Explicit Contract Monitors
34 | Unix Domain Sockets
35 | 2D Syntax
36 | GUI Libraries

► | 35 | 2D Syntax

35.1 | 2D Cond
35.2 | 2D Match
35.3 | 2D Tabular

On this page:

35.1`` 2D Cond
2dcond
35.2`` 2D Match
2dmatch
35.3`` 2D Tabular
2dmatch

top ← prev up next →

### 35`` 2D Syntax

#lang unstable/2d

The unstable/2d language installs #2d reader support in the readtable, and then chains to the reader of another language that is specified immediately after unstable/2d.

The #2d syntax extension adds the ability use a two-dimensional grid syntax. That is, you can drawn an ASCII-art grid and then treat that as an expression. For example, here is a simple equality function that operates on pairs and numbers, written using a #2d conditional expression:

> #lang unstable/2d racket
> (define (same? a b)
> #2dcond
> ╔═════════════╦═══════════════════════╦═════════════╗
> ║ ║ (pair? a) ║ (number? a) ║
> ╠═════════════╬═══════════════════════╬═════════════╣
> ║ (pair? b) ║ (and (same? (car a) ║ #f ║
> ║ ║ (car b)) ║ ║
> ║ ║ (same? (cdr a) ║ ║
> ║ ║ (cdr b))) ║ ║
> ╠═════════════╬═══════════════════════╬═════════════╣
> ║ (number? b) ║ #f ║ (= a b) ║
> ╚═════════════╩═══════════════════════╩═════════════╝)

This notation works in two stages: reading, and parsing (just as in Racket in general). The reading stage converts anything that begins with #2d into a parenthesized expression (possibly signaling errors if the ═ and ║ and ╬ characters do not line up in the right places).

Since the first line contains #2dcond, the reader will produce a sequence whose first position is the identifier 2dcond.

That macro will take over and then expand into ordinary conditional expressions, in this case figuring out whether or not the inputs are pairs or numbers and evaluating the code in the appropriate cell.

At the reader level, the syntax #2d notation checks the number of columns in the first row and uses that as a guide for where subsequent rows may appear. Once that first row is set, it serves as a guide to where the columns may appear in subsequent rows, although following columns may be merged.

This merging can simplify some uses of #2d expressions. For example, consider this expression that captures subtyping relationships between a few of the Typed Racket numeric types, this time using a #2d match expression:

> #lang unstable/2d racket
> (define (subtype? a b)
> #2dmatch
> ╔══════════╦══════════╦═══════╦══════════╗
> ║ a b ║ 'Integer ║ 'Real ║ 'Complex ║
> ╠══════════╬══════════╩═══════╩══════════╣
> ║ 'Integer ║ #t ║
> ╠══════════╬══════════╗ ║
> ║ 'Real ║ ║ ║
> ╠══════════╣ ╚═══════╗ ║
> ║ 'Complex ║ #f ║ ║
> ╚══════════╩══════════════════╩══════════╝)

There are a number of cell walls missing here, but this is still a well-formed #2d expression. In this case, the 2dmatch treats any of the situations that fall into the larger regions as the same.

#### 35.1`` 2D Cond

(require unstable/2d/cond)

> > syntax

> > (2dcond cond-content)

> cond-content

> =

> question-row
> body-row
> ⋮

> question-row |  | = |  | empty-cell question-cell ⋯
> body-row |  | = |  | question-cell exprs-cell ⋯

> question-cell

> =

> ╔═════════════╗
> ║question-expr║
> ╚═════════════╝

> empty-cell

> =

> ╔═══╗
> ║ ║
> ╚═══╝

> exprs-cell

> =

> ╔═════════════╗
> ║expr expr ...║
> ╚═════════════╝

Evaluates the first row of question expressions until one of them returns a true value (signaling an error if none do), then evaluates the first column of question expressions until one of them returns a true value (signaling an error if none do), and then evaluates the cell in the middle where both point to, returning the result of the last expression in that cell.

#### 35.2`` 2D Match

(require unstable/2d/match)

> > syntax

> > (2dmatch match-content)

> match-content

> =

> match-first-row
> match-row
> ⋮

> match-first-row |  | = |  | two-expr-cell match-pat-cell ⋯
> match-row |  | = |  | match-pat-cell exprs-cell ⋯

> two-expr-cell

> =

> ╔═════════════════╗
> ║col-expr row-expr║
> ╚═════════════════╝

> match-pat-cell

> =

> ╔═════╗
> ║ pat ║
> ╚═════╝

> exprs-cell

> =

> ╔═════════════╗
> ║expr expr ...║
> ╚═════════════╝

Matches col-expr against each of patterns in the first column of the table and matches row-expr against each of the patterns in the row row, and then evaluates the corresponding exprs-cell, returning the value of the last expression in that cell.

#### 35.3`` 2D Tabular

(require unstable/2d/tabular)

> > syntax

> > (2dmatch tabular-content)

> tabular-content

> =

> tabular-row
> ⋮

> |

> tabular-row
> ⋮
> style-cell

> tabular-row |  | = |  | tabular-cell ⋯

> tabular-cell

> =

> ╔════════════════╗
> ║tabular-expr ...║
> ╚════════════════╝

> style-cell

> =

> ╔═════════════════╗
> ║style-content ...║
> ╚═════════════════╝

> style-content |  | = |  | #:style style-expr
> |  | | |  | #:sep sep-expr
> |  | | |  | #:ignore-first-row

> > | style-expr |  | : |  | style?

> > | sep-expr |  | : |  | (or/c block? content? #f)

> > | tabular-expr |  | : |  | (or/c block? content?)

Constructs a tabular matching the given cells.

If a cell spans multiple columns, then the resulting tabular has 'cont in the corresponding list element. No cells may span rows.

The #:style and #:sep arguments are just passed to tabular.

If the #:ignore-first-row keyword is provided, then the first row of the 2dtabular expression is ignored. This can be used in case the first row of the rendered table should not have all of the columns (as #2d syntax requires that the first row contain a cell for each column that appears in the table).

top ← prev up next →