On Aug 7, 2014, at 9:39 AM, Alexander D. Knauth <[email protected]> wrote:

> 
> On Aug 7, 2014, at 1:41 AM, Kevin Forchione <[email protected]> wrote:
> 
>> 
>> On Aug 6, 2014, at 11:02 AM, Alexander D. Knauth <[email protected]> 
>> wrote:
>> 
>>> 
>>> On Aug 6, 2014, at 1:47 PM, Alexander D. Knauth <[email protected]> 
>>> wrote:
>>> 
>>>> 
>>>> 
>>>> On Aug 6, 2014, at 1:10 PM, Kevin Forchione <[email protected]> wrote:
>>>> 
>>>>> 
>>>>> On Aug 5, 2014, at 2:21 PM, Jens Axel Søgaard <[email protected]> 
>>>>> wrote:
>>>>> 
>>>>>> Is this a step in the right direction?
>>>>>> 
>>>>>> (define-syntax (x stx)
>>>>>> (syntax-parse stx
>>>>>>  [(_ (y ... (z ...) w ...))
>>>>>>   #'(xf (yf y ... (zf z ...) w ...))]))
>>>>>> 
>>>>>> The pattern (z ...) ... will match a sequence of lists such as (4 5 6) 
>>>>>> (7 8)
>>>>>> but it won't match (4 5 6) 7 8 from your example.
>>>>>> 
>>>>>> /Jens Axel
>>>>> 
>>>>> Closer. It doesn’t match something like ‘( 1 2 3 (4 5 6) 7 (8 9) 10), for 
>>>>> instance. 
>>>> 
>>>> For that I think you want something like this:
>>>> (syntax-parse stx
>>>>   [(_ (~or (z ...)
>>>>            y)
>>>>       ...)
>>>>    #'(xf (yf y ... (zf z ...)))])
>>> 
>>> Sorry I forgot an ellipsis.  I meant this:
>>> (syntax-parse stx
>>>   [(_ (~or (z ...)
>>>            y)
>>>       ...)
>>>    #'(xf (yf y ... (zf z ...) ...))])
>> 
>> 
>> Remarkably difficult just to parse what amounts to nested lists! This 
>> doesn’t quite do what I want either. For instance:
>> 
>> #lang racket
>> 
>> (require (for-syntax syntax/parse))
>> 
>> #;(define-syntax (x stx)
>>   
>>   (define-syntax-class binding
>>     #:description "binding list"
>>     (pattern (z:number ...)))
>>   
>>   (syntax-parse stx
>>     [(_ b:binding ...)
>>      #'(list (list b.z ...) ...)]))
>> 
>> #;(define-syntax (x stx)
>>   
>>   (define-syntax-class lbinding
>>     #:description "binding list"
>>     (pattern (z:number ...)))
>>   
>>   (define-syntax-class orbinding
>>     #:description "binding or"
>>     (pattern (y:number ...)
>>              #:with (z ...) #'(y ...))
>>     (pattern (lb:lbinding)
>>              #:with (z ...) #'(lb.z ...)))
>>   
>>   (syntax-parse stx
>>     [(_ ob:orbinding ...)
>>      #'(list (list ob.z ...) ...)]))
>> 
>> #;(define-syntax (x stx)
>>   
>>   (define-syntax-class lbinding
>>     #:description "binding list"
>>     (pattern (z:number ...)))
>>   
>>   (define-syntax-class orbinding
>>     #:description "binding or"
>>     (pattern (y:number ...)
>>              #:with (z ...) #'(y ...))
>>     (pattern (lb:lbinding)
>>              #:with (z ...) #'(lb.z ...)))
>>   
>>   (syntax-parse stx
>>     [(_ ob:orbinding ...)
>>      #'(list (list ob.z ...) ...)]))
>> 
>> (define-syntax (x stx)
>>   (syntax-parse stx
>>     [(_ (~or (z ...)
>>              y)
>>         ...)
>>      #'(list (list y ... (list z ...) ...))]))
>> 
>> (x (1 2 3 4) (5 (6 7) 8))
>> 
>> expands to:  (list (list (list 1 2 3 4) (list 5 (6 7) 8))))) instead of  
>> (list (list (list 1 2 3 4) (list 5 (list 6 7) 8))))). 
>> 
>> -Kevin
>> 
> 
> Do you want something like this then:
> (syntax-parse stx
>   [(_ (~or ((((e ...) ...) ...) ...)
>            (((d ...) ...) ...)
>            ((c ...) ...)
>            (b ...)
>            a)
>       . . .)
>    #’(list (list a ... (list b ... (list c ... (list d ... (list e ...) ...) 
> ...) ...) ...) ...)])

Sorry I meant this:
(syntax-parse #'(x (1 2 3 4) (5 (6 7) 8))
  [(_ (~or ((~or ((~or ((~or (e ...) d) ...) c) ...) b) ...) a) ...)
   #'(list (list a ... (list b ... (list c ... (list d ... (list e ...) ...) 
...) ...) ...))])

> Except going infinitely?  For that I think you would need a recursive helper 
> function.  
> 
> Or do you want to just replace all instances of (a ...) with (list a ...) ?:
> (define-syntax-class thing
>   #:attributes (norm)
>   [pattern (a:thing ...)
>            #:with norm (list a.norm ...)]
>   [pattern a
>            #:with norm a])
> 
> Or what?
> 
> 

____________________
  Racket Users list:
  http://lists.racket-lang.org/users

Reply via email to