Invoke a lambda returned from scheme, was Re: Need closures in macros

View: New views
3 Messages — Rating Filter:   Alert me  

Invoke a lambda returned from scheme, was Re: Need closures in macros

by Sam Liddicott :: Rate this Message:

| View Threaded | Show Only this Message

I've seen this example:
<extern|(lambda (x) `(concat "Hallo " ,x))|Piet>

And I've created this:
<extern|(lambda () `(lambda (x) `(concat "Hallo " ,x)))>
which returns such a lambda, but I've not been able to invoke that macro

<extern|<extern|(lambda () `(lambda (x) `(concat "Hallo " ,x)))>|hi>
fails with: Wrong type to apply:

Is this because extern expects a string and not a list?

I tried this:
<extern|(lambda (x) `(eval x)|<extern|(lambda () `(lambda (x) `(concat "Hallo
" ,x)))>|jo>

but still failure, so I remove the parameters of the name:
<extern|(lambda (x) `(eval x)|<extern|(lambda () `(lambda () `("Hallo ")))>>
But even that failed.

This one gives no error, only a black ? so it has most hope of being right:
<assign|x|<extern|(lambda () `(lambda () `(concat "Hallo ")))>>
<extern|(lambda (x) `(eval x))|<value|x>>

How should I invoke a lambda returned from scheme?

Sam

On Tue, May 22, 2012 at 8:09 AM, Sam Liddicott <sam@...> wrote:
My fake-page macros are working well, but don't quite do the trick.

If I take the reader through the first part of development of page 1, then I have many revisions of a document fake-page page 1. That works fine. Each revision has a different effective namespace and it's own section numbering and so on.

I then need to take the reader through development of the next part of page 1. These are further revisions of document 1 page 1, but showing further parts.

Thus the first revision of the next part of page 1 is the SAME revision as the previous fake page 1, and will inherit all the labels and numbering and so on.

However when I show the next revision of the second part of page 1 it is a new revision and inherits nothing! Aggh!

If I made it the same revision then it would inherit not only the last revision of the first part, but also the first revision of the second part.

So clearly I need closures, so that in any revision I can extract a closure which allows further pages to continue from that point at which the closure was made. More than once, without conflict.


I'm guessing that I would need a scheme function to create the closure. It would need to be a closure that accepted either any number of arguments or a tuple, and effectively invoked "compound". Or maybe even just took one argument which it eval's and returned, like "identity" but in a closure.

I'm not asking if I'm nuts, but I'm asking how to do this. As I search my lisp memory I can think of "curry" and stuff like that but things are complicated with the macro layer as well.

I shall post here as I develop the idea but if anyone can "do my homework" for me or give me a clue I would be very grateful

Sam


_______________________________________________
Texmacs-dev mailing list
Texmacs-dev@...
https://lists.gnu.org/mailman/listinfo/texmacs-dev

Re: Invoke a lambda returned from scheme, was Re: Need closures in macros

by Sam Liddicott :: Rate this Message:

| View Threaded | Show Only this Message

Progress, now I learned the scheme comma operator:

<assign|x|<extern|(lambda () `(lambda () `(concat "Hallo ")))>>

<extern|(lambda (x) `(eval ,x))|<value|x>>

gives: compound lambda

whatever that means

In case texmacs macro level variables can't hold a lamba, I tried:

<extern|(lambda () `(set! xx `(lambda () `(concat "Hallo "))))>

but the variable xx was not set or accessible from texmacs.

Sam

On Tue, May 22, 2012 at 9:13 AM, Sam Liddicott <sam@...> wrote:
I've seen this example:
<extern|(lambda (x) `(concat "Hallo " ,x))|Piet>

And I've created this:
<extern|(lambda () `(lambda (x) `(concat "Hallo " ,x)))>
which returns such a lambda, but I've not been able to invoke that macro

<extern|<extern|(lambda () `(lambda (x) `(concat "Hallo " ,x)))>|hi>
fails with: Wrong type to apply:

Is this because extern expects a string and not a list?

I tried this:
<extern|(lambda (x) `(eval x)|<extern|(lambda () `(lambda (x) `(concat "Hallo
" ,x)))>|jo>

but still failure, so I remove the parameters of the name:
<extern|(lambda (x) `(eval x)|<extern|(lambda () `(lambda () `("Hallo ")))>>
But even that failed.

This one gives no error, only a black ? so it has most hope of being right:
<assign|x|<extern|(lambda () `(lambda () `(concat "Hallo ")))>>
<extern|(lambda (x) `(eval x))|<value|x>>

How should I invoke a lambda returned from scheme?

Sam

On Tue, May 22, 2012 at 8:09 AM, Sam Liddicott <sam@...> wrote:
My fake-page macros are working well, but don't quite do the trick.

If I take the reader through the first part of development of page 1, then I have many revisions of a document fake-page page 1. That works fine. Each revision has a different effective namespace and it's own section numbering and so on.

I then need to take the reader through development of the next part of page 1. These are further revisions of document 1 page 1, but showing further parts.

Thus the first revision of the next part of page 1 is the SAME revision as the previous fake page 1, and will inherit all the labels and numbering and so on.

However when I show the next revision of the second part of page 1 it is a new revision and inherits nothing! Aggh!

If I made it the same revision then it would inherit not only the last revision of the first part, but also the first revision of the second part.

So clearly I need closures, so that in any revision I can extract a closure which allows further pages to continue from that point at which the closure was made. More than once, without conflict.


I'm guessing that I would need a scheme function to create the closure. It would need to be a closure that accepted either any number of arguments or a tuple, and effectively invoked "compound". Or maybe even just took one argument which it eval's and returned, like "identity" but in a closure.

I'm not asking if I'm nuts, but I'm asking how to do this. As I search my lisp memory I can think of "curry" and stuff like that but things are complicated with the macro layer as well.

I shall post here as I develop the idea but if anyone can "do my homework" for me or give me a clue I would be very grateful

Sam



_______________________________________________
Texmacs-dev mailing list
Texmacs-dev@...
https://lists.gnu.org/mailman/listinfo/texmacs-dev

Re: Invoke a lambda returned from scheme, was Re: Need closures in macros

by Sam Liddicott :: Rate this Message:

| View Threaded | Show Only this Message

I realised that maybe I needed to have the scheme enclose the returned lamba in an extern before returning it:

As the "concat" trick produced get-label of "concat" I guess that I would try and insert the word extern.

I tried various forms;
<assign|x|<extern|(lambda () (`extern `(lambda () `(concat "Hallo "))))>>
<assign|x|<extern|(lambda () `(extern `(lambda () `(concat "Hallo "))))>>
<assign|x|<extern|(lambda () (extern `(lambda () `(concat "Hallo "))))>>

But they all seemed to produce various scheme errors.

I will try playing with tm-define next


On Tue, May 22, 2012 at 9:13 AM, Sam Liddicott <sam@...> wrote:
I've seen this example:
<extern|(lambda (x) `(concat "Hallo " ,x))|Piet>

And I've created this:
<extern|(lambda () `(lambda (x) `(concat "Hallo " ,x)))>
which returns such a lambda, but I've not been able to invoke that macro

<extern|<extern|(lambda () `(lambda (x) `(concat "Hallo " ,x)))>|hi>
fails with: Wrong type to apply:

Is this because extern expects a string and not a list?

I tried this:
<extern|(lambda (x) `(eval x)|<extern|(lambda () `(lambda (x) `(concat "Hallo
" ,x)))>|jo>

but still failure, so I remove the parameters of the name:
<extern|(lambda (x) `(eval x)|<extern|(lambda () `(lambda () `("Hallo ")))>>
But even that failed.

This one gives no error, only a black ? so it has most hope of being right:
<assign|x|<extern|(lambda () `(lambda () `(concat "Hallo ")))>>
<extern|(lambda (x) `(eval x))|<value|x>>

How should I invoke a lambda returned from scheme?

Sam

On Tue, May 22, 2012 at 8:09 AM, Sam Liddicott <sam@...> wrote:
My fake-page macros are working well, but don't quite do the trick.

If I take the reader through the first part of development of page 1, then I have many revisions of a document fake-page page 1. That works fine. Each revision has a different effective namespace and it's own section numbering and so on.

I then need to take the reader through development of the next part of page 1. These are further revisions of document 1 page 1, but showing further parts.

Thus the first revision of the next part of page 1 is the SAME revision as the previous fake page 1, and will inherit all the labels and numbering and so on.

However when I show the next revision of the second part of page 1 it is a new revision and inherits nothing! Aggh!

If I made it the same revision then it would inherit not only the last revision of the first part, but also the first revision of the second part.

So clearly I need closures, so that in any revision I can extract a closure which allows further pages to continue from that point at which the closure was made. More than once, without conflict.


I'm guessing that I would need a scheme function to create the closure. It would need to be a closure that accepted either any number of arguments or a tuple, and effectively invoked "compound". Or maybe even just took one argument which it eval's and returned, like "identity" but in a closure.

I'm not asking if I'm nuts, but I'm asking how to do this. As I search my lisp memory I can think of "curry" and stuff like that but things are complicated with the macro layer as well.

I shall post here as I develop the idea but if anyone can "do my homework" for me or give me a clue I would be very grateful

Sam



_______________________________________________
Texmacs-dev mailing list
Texmacs-dev@...
https://lists.gnu.org/mailman/listinfo/texmacs-dev