[racket] iteration for user-defined data structures

From: Marijn (hkBst at gentoo.org)
Date: Wed Jun 1 08:40:47 EDT 2011

Hash: SHA1


I'm working on a doubly-linked list (dlist) implementation and have been
able to succesfully implement the prop:sequence #:property, allowing the
use of my data structure as a sequence, allowing for example to convert
to an ordinary list with `for/list'. I'm trying to now do the converse,
that is implement my own `for/dlist' for constructing dlists from
sequences, but I am having some trouble with the docs.

Specifically, in the reference there is "2.18.2 Deriving New Iteration
Forms"[1], which mentions `for/fold/derived' and
`define-sequence-syntax', but doesn't really explain what they are for
or how they should be used. The last time I thought I understood how to
proceed I tried to do:

(define (for/dlist
 (for/fold/derived for/dlist

after fruitlessly trying to complete:

(define-sequence-syntax for/dlist
  (for/fold/derived for/dlist

but clearly I have no clue how this is supposed to work and I am
currently not even sure that these constructs are there for supporting
what I want to do. Some help would be highly appreciated.

Some of the things that 2.18.2 does say, are worded rather poorly in my
opinion, so for my part I will present some rewordings that I hope are
more direct and clearer:

Old paragraphs:
Defines id as syntax. An (id . rest) form is treated specially when used
to generate a sequence in a clause of for (or one of its variants). In
that case, the procedure result of clause-transform-expr is called to
transform the clause.
When id is used in any other expression position, the result of
expr-transform-expr is used. If it is a procedure of zero arguments,
then the result must be an identifier other-id, and any use of id is
converted to a use of other-id. Otherwise,expr-transform-expr must
produce a procedure (of one argument) that is used as a macro transformer.

Proposed replacement paragraphs:
Defines id as syntax that is treated specially when used in/as
[whichever is correct] a clause of an iteration (for, for/list, ...). In
this special case, clause-transform-expr should evaluate to a syntax
transformer (a procedure that takes a single syntax object argument and
returns another) which is then called in the place of id except when it
would return #f.
When id is not used in a clause of an iteration, expr-transform-expr
should either evaluate to a syntax transformer which is called in the
place of id,
or a thunk which returns an identifier other-id, which is used to
convert each use of id to other-id.

My understanding of the rest of that subsection is yet too low to
attempt a rewrite.


Version: GnuPG v2.0.17 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/


Posted on the users mailing list.