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

Reply via email to