unofficial mirror of guile-user@gnu.org 
 help / color / mirror / Atom feed
* Backquote simplification
@ 2010-12-09 11:00 Hans Aberg
       [not found] ` <CCCBC725-4AE9-4585-B18D-7DF6650D5880@mac.com>
  0 siblings, 1 reply; 8+ messages in thread
From: Hans Aberg @ 2010-12-09 11:00 UTC (permalink / raw)
  To: guile-user

Is it possible to simplify the backquote construct `(,x_1 ... ,x_k)  
(always unquote on all arguments) somehow, so that the unquote does  
not need to appear multiple times (depending on k)? (I construct these  
in the C-interface, and it would simplify not having to remove a  
sequence of them.)

Specifically, in
   (define g (lambda (x . y) `(,x . ,y)))
then evaluations like (g 1 2 3), (g 1 2 . (3 4)) work.

So I would want something like
   (define g (lambda (x . y) (b x . y))))
where (b x . y) might be any expression where the unquote does not  
need to appear on every variable. Only combinations line
   (define g (lambda (x . y) (b `(,x . ,y))))
seem to work.

   Hans





^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: Backquote simplification
       [not found] ` <CCCBC725-4AE9-4585-B18D-7DF6650D5880@mac.com>
@ 2010-12-09 19:44   ` Hans Aberg
  2010-12-10 23:12     ` Neil Jerram
  0 siblings, 1 reply; 8+ messages in thread
From: Hans Aberg @ 2010-12-09 19:44 UTC (permalink / raw)
  To: dskr; +Cc: guile-user

[Your reply does not seem to be on the list, so I cc it.]

Thanks. I might try an iterated cons, that is a function f such such  
that
   (f x1 ... xk y) --> (cons x1 ... (cons xk y) ...))

Then
   (lambda (x1 ... xk . y) (f x1 ... xk y))
should just return at least k arguments as a list.

I'm not sure right now how to write it, so thankful for help.



On 9 Dec 2010, at 18:44, dskr@mac.com wrote:

> Hi,
>
> You need not use quoting at all in these cases.
>
> ( 1 2 . ( 3 4 ) ) is exactly equivalent to ( 1 2 3 4 ) and ( 1 .  
> ( 2 . ( 3 . ( 4 ) ) ) )
>
> (b ( cons x y ))
> or
> (apply b x y)
>
> I cannot quite tell fom your example.
>
> Cheers,
>  Dan




^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: Backquote simplification
  2010-12-09 19:44   ` Hans Aberg
@ 2010-12-10 23:12     ` Neil Jerram
  2010-12-11  0:03       ` Hans Aberg
  0 siblings, 1 reply; 8+ messages in thread
From: Neil Jerram @ 2010-12-10 23:12 UTC (permalink / raw)
  To: Hans Aberg; +Cc: guile-user

Hans Aberg <haberg-1@telia.com> writes:

> [Your reply does not seem to be on the list, so I cc it.]
>
> Thanks. I might try an iterated cons, that is a function f such such
> that
>   (f x1 ... xk y) --> (cons x1 ... (cons xk y) ...))

Isn't that just `list'?

More generally: I've been reading your emails, but I'm afraid I have no
idea what you are trying to do.  Perhaps you could step back and explain
that overall, before continuing with details.

       Neil



^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: Backquote simplification
  2010-12-10 23:12     ` Neil Jerram
@ 2010-12-11  0:03       ` Hans Aberg
  2010-12-11  0:25         ` Neil Jerram
  0 siblings, 1 reply; 8+ messages in thread
From: Hans Aberg @ 2010-12-11  0:03 UTC (permalink / raw)
  To: Neil Jerram; +Cc: guile-user

On 11 Dec 2010, at 00:12, Neil Jerram wrote:

>> [Your reply does not seem to be on the list, so I cc it.]
>>
>> Thanks. I might try an iterated cons, that is a function f such such
>> that
>>  (f x1 ... xk y) --> (cons x1 ... (cons xk y) ...))
>
> Isn't that just `list'?
>
> More generally: I've been reading your emails, but I'm afraid I have  
> no
> idea what you are trying to do.  Perhaps you could step back and  
> explain
> that overall, before continuing with details.

The reply I got was helpful, but I decided to settle for a macro  
implementation:

(use-syntax (ice-9 syncase))

(define-syntax tuple
   (syntax-rules ()
     ((tuple xs ...)
      `(tuple ,xs ...))
     ((tuple x1 x2 . y)
      (append `(tuple ,x1 ,x2) y))
     ((tuple x1 . y)
      (append `(tuple ,x1) y))
))

It behaves as I want in my context, a functional language on top of  
Guile. I decided to implement the construct (lambda (x_1 ... x_k . y)  
f) using an improper list (x_1 ... x_k . y); when it is a proper list,  
one just gets the fixed number of arguments construct.

Then the object (x_1 ... x_k . y) also become available, so it is  
possible to form
   (define f (lambda (x_1 ... x_k . y) (x_1 ... x_k . y)))
Then one would expect f(a_1, ..., a_n), for n >= k, to be (a_1, ...,  
a_n) - this a form of the identity.

So to get this effect, I need a function g that can call improper  
lists (g x_1, ..., x_k . y), where y is a list. For some reason, the  
substitution of the list y to get a list for the function g does not  
work in this situation, exception for the macro definition above, g =  
tuple.

Then, there is another problem with this macro: if having the ".", one  
cannot have "...", like would be needed say when implementing (define  
(f x_1 ... x_k . y) ...) expanding to (define f (lambda (x_1 ... x_k .  
y) ...) for any k. That is, the following isn't legal:

(define-syntax tuple
   (syntax-rules ()
     ((tuple xs ...)
      `(tuple ,xs ...))
     ((tuple xs ... . y)
      `(tuple ,xs ... . ,y))
))

But if it would have been, it would produce what I want.




^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: Backquote simplification
  2010-12-11  0:03       ` Hans Aberg
@ 2010-12-11  0:25         ` Neil Jerram
  2010-12-11  8:33           ` Hans Aberg
  0 siblings, 1 reply; 8+ messages in thread
From: Neil Jerram @ 2010-12-11  0:25 UTC (permalink / raw)
  To: Hans Aberg; +Cc: guile-user

Hans Aberg <haberg-1@telia.com> writes:

> The reply I got was helpful, but I decided to settle for a macro
> implementation:
>
> (use-syntax (ice-9 syncase))
>
> (define-syntax tuple
>   (syntax-rules ()
>     ((tuple xs ...)
>      `(tuple ,xs ...))
>     ((tuple x1 x2 . y)
>      (append `(tuple ,x1 ,x2) y))
>     ((tuple x1 . y)
>      (append `(tuple ,x1) y))
> ))

OK, I roughly see that this solves your problem of wanting to unquote an
arbitrary number of list elements.  (Although I don't understand why you
need to do that.)

> It behaves as I want in my context, a functional language on top of
> Guile.

Scheme is already a functional language, isn't it?

> I decided to implement the construct (lambda (x_1 ... x_k . y)
> f)

What syntax is that expression in?  In Scheme syntax, it's a lambda that
returns a value that is apparently unrelated to any of the arguments,
and so could equally well be written as (lambda ignored-args f).

> using an improper list (x_1 ... x_k . y); when it is a proper list,
> one just gets the fixed number of arguments construct.
>
> Then the object (x_1 ... x_k . y) also become available, so it is
> possible to form
>   (define f (lambda (x_1 ... x_k . y) (x_1 ... x_k . y)))

How is this different from 

  (define f (lambda args args))

?

> Then one would expect f(a_1, ..., a_n), for n >= k, to be (a_1, ...,
> a_n) - this a form of the identity.
>
> So to get this effect, I need a function g that can call improper
> lists (g x_1, ..., x_k . y), where y is a list.

As Dan pointed out, that is not an improper list.  It's a proper list.

In the hope that these questions might be useful to at least one of us...

        Neil



^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: Backquote simplification
  2010-12-11  0:25         ` Neil Jerram
@ 2010-12-11  8:33           ` Hans Aberg
  2010-12-11 10:01             ` Neil Jerram
  0 siblings, 1 reply; 8+ messages in thread
From: Hans Aberg @ 2010-12-11  8:33 UTC (permalink / raw)
  To: Neil Jerram; +Cc: guile-user

On 11 Dec 2010, at 01:25, Neil Jerram wrote:

>> The reply I got was helpful, but I decided to settle for a macro
>> implementation:
>>
>> (use-syntax (ice-9 syncase))
>>
>> (define-syntax tuple
>>  (syntax-rules ()
>>    ((tuple xs ...)
>>     `(tuple ,xs ...))
>>    ((tuple x1 x2 . y)
>>     (append `(tuple ,x1 ,x2) y))
>>    ((tuple x1 . y)
>>     (append `(tuple ,x1) y))
>> ))
>
> OK, I roughly see that this solves your problem of wanting to  
> unquote an
> arbitrary number of list elements.  (Although I don't understand why  
> you
> need to do that.)

One reason is that in the normal syntax f(x_1, ..., x_k) there are two  
separate parts f and (x_1, ..., x_k) that are combined, whereas in  
Scheme it is combined to one (f x_1 ... x_k) and does not have a  
concept for the (x_1, ..., x_k). Another is that it is needed in the  
translation of expressions like f(g(x)) --> (f (g x)), and (f g)x -->  
((f g) x).

>> It behaves as I want in my context, a functional language on top of
>> Guile.
>
> Scheme is already a functional language, isn't it?

I am using Bison/Flex parser/lexer to generate a different syntax. It  
turns out to be a good help not having to implement the back-end.

>> I decided to implement the construct (lambda (x_1 ... x_k . y)
>> f)
>
> What syntax is that expression in?  In Scheme syntax, it's a lambda  
> that
> returns a value that is apparently unrelated to any of the arguments,
> and so could equally well be written as (lambda ignored-args f).

I implement it using Guile C calls, and when constructing using
scm_list_3(scm_sym_lambda, x, f), it turns out that x = (x_1 ... x_k .  
y) is an improper list.

>> using an improper list (x_1 ... x_k . y); when it is a proper list,
>> one just gets the fixed number of arguments construct.
>>
>> Then the object (x_1 ... x_k . y) also become available, so it is
>> possible to form
>>  (define f (lambda (x_1 ... x_k . y) (x_1 ... x_k . y)))
>
> How is this different from
>
>  (define f (lambda args args))
>
> ?

The form (x_1 ... x_k . y) is an improper list that requires at least  
k arguments, and the rest given arguments are put into y as a list.

>> Then one would expect f(a_1, ..., a_n), for n >= k, to be (a_1, ...,
>> a_n) - this a form of the identity.
>>
>> So to get this effect, I need a function g that can call improper
>> lists (g x_1, ..., x_k . y), where y is a list.
>
> As Dan pointed out, that is not an improper list.  It's a proper list.

That would be true if the evaluator does not try to evaluate the  
expression before the substitution of y. That works in the case of a  
freestanding (g x_1 ... x_k . y), but for some reason not in the form
   (lambda (x_1 ... x_k . y) (g x_1 ... x_k . y))

I do not know why.

> In the hope that these questions might be useful to at least one of  
> us...

I do not know what that means.




^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: Backquote simplification
  2010-12-11  8:33           ` Hans Aberg
@ 2010-12-11 10:01             ` Neil Jerram
  2010-12-11 10:09               ` Hans Aberg
  0 siblings, 1 reply; 8+ messages in thread
From: Neil Jerram @ 2010-12-11 10:01 UTC (permalink / raw)
  To: Hans Aberg; +Cc: guile-user

Hi Hans,

To reply quickly to one point in your email...  (I'll ponder the rest
later.)

Hans Aberg <haberg-1@telia.com> writes:

> On 11 Dec 2010, at 01:25, Neil Jerram wrote:
>
>> In the hope that these questions might be useful to at least one of
>> us...
>
> I do not know what that means.

I meant that I'm sure I don't understand yet what you're doing, and
hence that the answers might help me; and that there was a possibility
that you might not be understanding some things, and that in that case
the discussion might help you too.

Regards,
        Neil



^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: Backquote simplification
  2010-12-11 10:01             ` Neil Jerram
@ 2010-12-11 10:09               ` Hans Aberg
  0 siblings, 0 replies; 8+ messages in thread
From: Hans Aberg @ 2010-12-11 10:09 UTC (permalink / raw)
  To: Neil Jerram; +Cc: guile-user

On 11 Dec 2010, at 11:01, Neil Jerram wrote:

> To reply quickly to one point in your email...  (I'll ponder the rest
> later.)

Whenever you so want.

>>> In the hope that these questions might be useful to at least one of
>>> us...
>>
>> I do not know what that means.
>
> I meant that I'm sure I don't understand yet what you're doing, and
> hence that the answers might help me; and that there was a possibility
> that you might not be understanding some things, and that in that case
> the discussion might help you too.

Yes, the replies are helpful, though I am programming also directly  
with Guile C calls involving unevaluated expressions.




^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2010-12-11 10:09 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-12-09 11:00 Backquote simplification Hans Aberg
     [not found] ` <CCCBC725-4AE9-4585-B18D-7DF6650D5880@mac.com>
2010-12-09 19:44   ` Hans Aberg
2010-12-10 23:12     ` Neil Jerram
2010-12-11  0:03       ` Hans Aberg
2010-12-11  0:25         ` Neil Jerram
2010-12-11  8:33           ` Hans Aberg
2010-12-11 10:01             ` Neil Jerram
2010-12-11 10:09               ` Hans Aberg

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).