David, Lisps have had cyclic syntax for decades [*]. When you use S-expressions
to represent syntax (reading and macroing) and when your S-expressions support
mutation, you don't have much of a choice. Once you separate syntax
representation from S-expressions (your major data structure), you can simplify
the representation of syntax and thus a good part of your compiler front end.
-- Matthias
[*] In the beginning they used circularity to create loops, no kidding.
On Feb 21, 2011, at 5:35 PM, David Herman wrote:
> Hi Matthew,
>
> Thanks very much for the response.
>
>> The docs for `datum->syntax' say that graph structure is disallowed,
>> and I think the behavior of `eval' below follows from the default eval
>> handler's use of `datum->syntax'.
>
> OK, thanks.
>
>> Since `read-syntax' and `datum->syntax' don't support graph structure,
>> there's no way to construct cyclic input to the expander --- or, in
>> particular, to write a cyclic literal under `quote'. Literals with
>> cycles were supported at one point, but they were fragile and almost
>> never useful.
>
> Presumably they might be more useful if we didn't have the `shared' notation,
> right?
>
> But IIUC, cyclic literals are problematic because there's nothing stopping
> you from embedding arbitrary expressions inside literals, making it perhaps
> possible to trick the compiler into diverging or even create paradoxical
> cross-stage cycles. Which suggests that, despite its alluring simplicity, the
> "#...=" notation should be confined to {de}serialization libraries such as
> `read', while more restricted notations like `shared' are safer for providing
> graph-structured literals.
>
> Does that sound like the (rough) rationale behind Racket's approach?
>
> Dave
>
>>
>> At Mon, 21 Feb 2011 08:18:34 -0800, David Herman wrote:
>>> Any chance someone has an answer to my question below?
>>>
>>> Thanks,
>>> Dave
>>>
>>> On Feb 14, 2011, at 4:42 PM, David Herman wrote:
>>>
>>>> One more data point:
>>>>
>>>>> (eval (read (open-input-string "#1=(sin #1#)")))
>>>> datum->syntax: cannot create syntax from cyclic datum: #0='(sin #0#)
>>>>
>>>> So that's another clue: it looks like Racket goes to pretty great lengths
>>>> to
>>> prevent the compiler from receiving cyclic AST's.
>>>>
>>>> Anyway, it would be good to know if there's a place in the docs where this
>>>> is
>>> spelled out.
>>>>
>>>> Dave
>>>>
>>>> On Feb 14, 2011, at 4:21 PM, David Herman wrote:
>>>>
>>>>> I've never been fully acquainted with the graph reader, so I did a little
>>> REPL-experimenting and doc-hunting. It appears Racket is pretty
>>> conservative
>>> about where it allows you to use graph syntax:
>>>>>
>>>>>> (define x '#0=(foo . #0#))
>>>>> read: #..-expressions not allowed in read-syntax mode
>>>>>
>>>>> I imagine this is because cyclic AST's are Really Really Scary:
>>>>>
>>>>> #0=(sin #0#))
>>>>>
>>>>> But I can't quite figure out where, if anywhere, graph-structured
>>> S-expressions *are* allowed in the Racket syntax. Certainly, you can use
>>> them
>>> for a programmatic read:
>>>>>
>>>>>> (read (open-input-string "#0=(foo . #0#)"))
>>>>> #0=(foo . #0#)
>>>>>
>>>>> But is there no place in the surface syntax where you can ever use the
>>>>> graph
>>> syntax? Is the `shared' library the only declarative syntax for creating
>>> cyclic
>>> data structures?
>>>>>
>>>>> Is this a pretty straightforward restriction that was already done in
>>>>> Common
>>> Lisp, or did they allow wild-and-wooly, unrestricted uses of cyclic AST's
>>> that
>>> (educated guess...) result in undefined behavior by the compiler?
>>>>>
>>>>> Dave
>>>>>
>>>>> PS Happy Valentine's Day!
>>>>>
>>>>>
>>>>> _________________________________________________
>>>>> For list-related administrative tasks:
>>>>> http://lists.racket-lang.org/listinfo/users
>>>>
>>>>
>>>> _________________________________________________
>>>> For list-related administrative tasks:
>>>> http://lists.racket-lang.org/listinfo/users
>>>
>>>
>>> _________________________________________________
>>> For list-related administrative tasks:
>>> http://lists.racket-lang.org/listinfo/users
>
>
> _________________________________________________
> For list-related administrative tasks:
> http://lists.racket-lang.org/listinfo/users
_________________________________________________
For list-related administrative tasks:
http://lists.racket-lang.org/listinfo/users