Re: [Factor-talk] printf documentation

2018-01-19 Thread Alexander Ilin
Doug and John, thank you for the thorough explanation! 19.01.2018, 00:31, "John Benediktsson" :See this macro: MACRO: add ( n -- quot )    [ \ + ] [ ] replicate-as ; It's "stack effect" depends on the input.     IN: scratchpad [ 1 add ] infer .    ( x x -- x )     IN: scratchpad [ 2 add ] infer .    ( x x x -- x ) So you really can't do much more than say this macro produces some quotation. Then in calling code, we expand the macro and check the resulting body of code has the right stack effect.     : foo1 ( a b -- c ) 1 add ;    : foo2 ( a b c -- d ) 2 add ;    : foo3 ( a b c d -- e ) 3 add ;On Thu, Jan 18, 2018 at 1:04 PM, Doug Coleman  wrote:Oops. MACRO: printf ( string -- quot: ( ..a string -- ..b ) )MACRO: sprintf ( string -- quot: ( ..a string -- ..b string ) )   On Thu, Jan 18, 2018 at 3:02 PM John Benediktsson  wrote:MACRO: always produces a quot. But when it's "called" it's whatever the stack effect of that produced quot is when it's expanded into the calling site.On Thu, Jan 18, 2018 at 12:36 PM, Alexander Ilin  wrote:O-kay... Let me try to ask my question again... I've read the blog post that you linked to. In there I found the following declaration:`MACRO: printf ( format-string -- )` This means that the macro takes one argument and removes it from the stack, doesn't put anything back. But in the actual source code of the `formatting` vocab the declaration is: `MACRO: printf ( format-string -- quot )`, which looks as if the `printf` word takes one parameter off the stack and puts one item back on the stack. ... which is not true: it doesn't put a quotation on the stack, because it calls the quotation. So, I have two questions, basically: 1) why not change the declaration in `formatting` to ``MACRO: printf ( format-string -- )` - with no output onto the stack?2) are `MACRO:`s allowed to have invalid stack effect declaration? Are they somehow exempted from the compiler checks? I'm asking this because the declared stack effect shows up in the documentation, and is confusing. Reading it gives the _expression_ that it should be used with an extra `call` to the produced quotation:`11 "he%do, world" printf call` 18.01.2018, 19:00, "John Benediktsson" :Both of those are macros (basically special words that produce a quotation), so when "called" they are first macro-expanded into a quotation and then that quotation is called, with whatever stack effect it has. IN: scratchpad 1 2 3 "%s %s %s" printf1 2 3 IN: scratchpad [ "%s %s %s" printf ] infer( x x x -- ) IN: scratchpad [ "%s %s %s" printf ] expand-macros[    [ present ] 2 ndip [ " " ] 2 ndip [ present ] 1 ndip    [ " " ] 1 ndip [ present ] 0 ndip output-stream get    [ stream-write ] curry 5 napply] Maybe the article I wrote when developing it would help: https://re-factor.blogspot.com/2011/08/printf.html  On Thu, Jan 18, 2018 at 4:32 AM, Alexander Ilin  wrote:Hello!  There are two similar words: printf and sprintf. They have similar stack effects, but different behavior.MACRO: sprintf ( format-string -- result )leaves a string on stackMACRO: printf ( format-string -- quot )leaves nothing on stack despite the stack effect specified  How come `printf` does'n obey its declared stack effect?---=--- Александр  ---=---Александр --Check out the vibrant tech community on one of the world's mostengaging tech sites, Slashdot.org! http://sdm.link/slashdot___Factor-talk mailing listFactor-talk@lists.sourceforge.nethttps://lists.sourceforge.net/lists/listinfo/factor-talk --Check out the vibrant tech community on one of the world's mostengaging tech sites, Slashdot.org! http://sdm.link/slashdot___Factor-talk mailing listFactor-talk@lists.sourceforge.nethttps://lists.sourceforge.net/lists/listinfo/factor-talk--Check out the vibrant tech community on one of the world's mostengaging tech sites, Slashdot.org! http://sdm.link/slashdot___Factor-talk mailing listFactor-talk@lists.sourceforge.nethttps://lists.sourceforge.net/lists/listinfo/factor-talk ,--Check out the vibrant tech community on one of the world's mostengaging tech sites, Slashdot.org! http://sdm.link/slashdot,___Factor-talk mailing listFactor-talk@lists.sourceforge.nethttps://lists.sourceforge.net/lists/listinfo/factor-talk  ---=---Александр --
Check out the vibrant tech community on one of the world's most
engaging tech sites, 

Re: [Factor-talk] printf documentation

2018-01-18 Thread John Benediktsson
See this macro:

MACRO: add ( n -- quot )
[ \ + ] [ ] replicate-as ;

It's "stack effect" depends on the input.

IN: scratchpad [ 1 add ] infer .
( x x -- x )

IN: scratchpad [ 2 add ] infer .
( x x x -- x )

So you really can't do much more than say this macro produces some
quotation.

Then in calling code, we expand the macro and check the resulting body of
code has the right stack effect.

: foo1 ( a b -- c ) 1 add ;
: foo2 ( a b c -- d ) 2 add ;
: foo3 ( a b c d -- e ) 3 add ;




On Thu, Jan 18, 2018 at 1:04 PM, Doug Coleman 
wrote:

> Oops.
>
> MACRO: printf ( string -- quot: ( ..a string -- ..b ) )
> MACRO: sprintf ( string -- quot: ( ..a string -- ..b string ) )
>
>
>
> On Thu, Jan 18, 2018 at 3:02 PM John Benediktsson 
> wrote:
>
>> MACRO: always produces a quot.
>>
>> But when it's "called" it's whatever the stack effect of that produced
>> quot is when it's expanded into the calling site.
>>
>>
>>
>>
>> On Thu, Jan 18, 2018 at 12:36 PM, Alexander Ilin 
>> wrote:
>>
>>> O-kay... Let me try to ask my question again...
>>>
>>> I've read the blog post that you linked to. In there I found the
>>> following declaration:
>>> `*MACRO:* printf ( format-string -- )`
>>>
>>> This means that the macro takes one argument and removes it from the
>>> stack, doesn't put anything back.
>>>
>>> But in the actual source code of the `formatting` vocab the declaration
>>> is: `MACRO: printf ( format-string -- quot )`, which looks as if the
>>> `printf` word takes one parameter off the stack and puts one item back on
>>> the stack.
>>>
>>> ... which is not true: it doesn't put a quotation on the stack, because
>>> it calls the quotation.
>>>
>>> So, I have two questions, basically:
>>>
>>> 1) why not change the declaration in `formatting` to ``MACRO: printf (
>>> format-string -- )` - with no output onto the stack?
>>> 2) are `MACRO:`s allowed to have invalid stack effect declaration? Are
>>> they somehow exempted from the compiler checks?
>>>
>>> I'm asking this because the declared stack effect shows up in the
>>> documentation, and is confusing. Reading it gives the expression that it
>>> should be used with an extra `call` to the produced quotation:
>>> `11 "he%do, world" printf call`
>>>
>>> 18.01.2018, 19:00, "John Benediktsson" :
>>>
>>> Both of those are macros (basically special words that produce a
>>> quotation), so when "called" they are first macro-expanded into a quotation
>>> and then that quotation is called, with whatever stack effect it has.
>>>
>>> IN: scratchpad 1 2 3 "%s %s %s" printf
>>> 1 2 3
>>>
>>> IN: scratchpad [ "%s %s %s" printf ] infer
>>> ( x x x -- )
>>>
>>> IN: scratchpad [ "%s %s %s" printf ] expand-macros
>>> [
>>> [ present ] 2 ndip [ " " ] 2 ndip [ present ] 1 ndip
>>> [ " " ] 1 ndip [ present ] 0 ndip output-stream get
>>> [ stream-write ] curry 5 napply
>>> ]
>>>
>>> Maybe the article I wrote when developing it would help:
>>>
>>> https://re-factor.blogspot.com/2011/08/printf.html
>>>
>>>
>>> On Thu, Jan 18, 2018 at 4:32 AM, Alexander Ilin 
>>> wrote:
>>>
>>> Hello!
>>>
>>>   There are two similar words: printf and sprintf. They have similar
>>> stack effects, but different behavior.
>>>
>>> MACRO: sprintf ( format-string -- result )
>>> leaves a string on stack
>>>
>>> MACRO: printf ( format-string -- quot )
>>> leaves nothing on stack despite the stack effect specified
>>>
>>>   How come `printf` does'n obey its declared stack effect?
>>>
>>> ---=---
>>>  Александр
>>>
>>>
>>>
>>> ---=---
>>> Александр
>>>
>>>
>>> 
>>> --
>>> Check out the vibrant tech community on one of the world's most
>>> engaging tech sites, Slashdot.org! http://sdm.link/slashdot
>>> ___
>>> Factor-talk mailing list
>>> Factor-talk@lists.sourceforge.net
>>> https://lists.sourceforge.net/lists/listinfo/factor-talk
>>>
>>>
>> 
>> --
>> Check out the vibrant tech community on one of the world's most
>> engaging tech sites, Slashdot.org! http://sdm.link/slashdot__
>> _
>> Factor-talk mailing list
>> Factor-talk@lists.sourceforge.net
>> https://lists.sourceforge.net/lists/listinfo/factor-talk
>>
>
> 
> --
> Check out the vibrant tech community on one of the world's most
> engaging tech sites, Slashdot.org! http://sdm.link/slashdot
> ___
> Factor-talk mailing list
> Factor-talk@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/factor-talk
>
>
--
Check out the vibrant tech community on one of the world's most
engaging 

Re: [Factor-talk] printf documentation

2018-01-18 Thread Doug Coleman
Oops.

MACRO: printf ( string -- quot: ( ..a string -- ..b ) )
MACRO: sprintf ( string -- quot: ( ..a string -- ..b string ) )



On Thu, Jan 18, 2018 at 3:02 PM John Benediktsson  wrote:

> MACRO: always produces a quot.
>
> But when it's "called" it's whatever the stack effect of that produced
> quot is when it's expanded into the calling site.
>
>
>
>
> On Thu, Jan 18, 2018 at 12:36 PM, Alexander Ilin  wrote:
>
>> O-kay... Let me try to ask my question again...
>>
>> I've read the blog post that you linked to. In there I found the
>> following declaration:
>> `*MACRO:* printf ( format-string -- )`
>>
>> This means that the macro takes one argument and removes it from the
>> stack, doesn't put anything back.
>>
>> But in the actual source code of the `formatting` vocab the declaration
>> is: `MACRO: printf ( format-string -- quot )`, which looks as if the
>> `printf` word takes one parameter off the stack and puts one item back on
>> the stack.
>>
>> ... which is not true: it doesn't put a quotation on the stack, because
>> it calls the quotation.
>>
>> So, I have two questions, basically:
>>
>> 1) why not change the declaration in `formatting` to ``MACRO: printf (
>> format-string -- )` - with no output onto the stack?
>> 2) are `MACRO:`s allowed to have invalid stack effect declaration? Are
>> they somehow exempted from the compiler checks?
>>
>> I'm asking this because the declared stack effect shows up in the
>> documentation, and is confusing. Reading it gives the expression that it
>> should be used with an extra `call` to the produced quotation:
>> `11 "he%do, world" printf call`
>>
>> 18.01.2018, 19:00, "John Benediktsson" :
>>
>> Both of those are macros (basically special words that produce a
>> quotation), so when "called" they are first macro-expanded into a quotation
>> and then that quotation is called, with whatever stack effect it has.
>>
>> IN: scratchpad 1 2 3 "%s %s %s" printf
>> 1 2 3
>>
>> IN: scratchpad [ "%s %s %s" printf ] infer
>> ( x x x -- )
>>
>> IN: scratchpad [ "%s %s %s" printf ] expand-macros
>> [
>> [ present ] 2 ndip [ " " ] 2 ndip [ present ] 1 ndip
>> [ " " ] 1 ndip [ present ] 0 ndip output-stream get
>> [ stream-write ] curry 5 napply
>> ]
>>
>> Maybe the article I wrote when developing it would help:
>>
>> https://re-factor.blogspot.com/2011/08/printf.html
>>
>>
>> On Thu, Jan 18, 2018 at 4:32 AM, Alexander Ilin  wrote:
>>
>> Hello!
>>
>>   There are two similar words: printf and sprintf. They have similar
>> stack effects, but different behavior.
>>
>> MACRO: sprintf ( format-string -- result )
>> leaves a string on stack
>>
>> MACRO: printf ( format-string -- quot )
>> leaves nothing on stack despite the stack effect specified
>>
>>   How come `printf` does'n obey its declared stack effect?
>>
>> ---=---
>>  Александр
>>
>>
>>
>> ---=---
>> Александр
>>
>>
>>
>> --
>> Check out the vibrant tech community on one of the world's most
>> engaging tech sites, Slashdot.org! http://sdm.link/slashdot
>> ___
>> Factor-talk mailing list
>> Factor-talk@lists.sourceforge.net
>> https://lists.sourceforge.net/lists/listinfo/factor-talk
>>
>>
>
> --
> Check out the vibrant tech community on one of the world's most
> engaging tech sites, Slashdot.org! http://sdm.link/slashdot
> ___
> Factor-talk mailing list
> Factor-talk@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/factor-talk
>
--
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot___
Factor-talk mailing list
Factor-talk@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/factor-talk


Re: [Factor-talk] printf documentation

2018-01-18 Thread Doug Coleman
We don't really have a solution for this right now.

Your stack effects wouldn't match with the convention we have right now of
just saying it outputs a ``quot``. I think we need to fix the stack checker
to be more exact before we change the code here.

This looks more correct but goes against convention:

MACRO: printf ( ..a string -- ..b )
MACRO: sprintf ( ..a string -- ..b string )

On Thu, Jan 18, 2018 at 2:50 PM Alexander Ilin  wrote:

> Can I simply change the stack effects for the purposes of documenting them
> like this?
> ```
> MACRO: printf ( ... string -- )
> MACRO: sprintf ( ... string -- result )
> ```
>
>
> 18.01.2018, 23:44, "Doug Coleman" :
>
> Stack effects on macros are not checked. We have the convention of lying
> that the stack effect is ( input -- quot ) but even that is wrong, as the
> macro is called immediately so you don't get a quot on the stack. The quot
> could have a stack effect of its own but it's variable arity, as you are
> seeing with printf. If you have a way to resolve this, lemme know!
>
> (One idea is "input-only stack effects" which don't have an output, so you
> could do ``MACRO: printf ( string ) ... ;``)
>
> On Thu, Jan 18, 2018 at 2:36 PM Alexander Ilin  wrote:
>
> O-kay... Let me try to ask my question again...
>
> I've read the blog post that you linked to. In there I found the following
> declaration:
> `*MACRO:* printf ( format-string -- )`
>
> This means that the macro takes one argument and removes it from the
> stack, doesn't put anything back.
>
> But in the actual source code of the `formatting` vocab the declaration
> is: `MACRO: printf ( format-string -- quot )`, which looks as if the
> `printf` word takes one parameter off the stack and puts one item back on
> the stack.
>
> ... which is not true: it doesn't put a quotation on the stack, because it
> calls the quotation.
>
> So, I have two questions, basically:
>
> 1) why not change the declaration in `formatting` to ``MACRO: printf (
> format-string -- )` - with no output onto the stack?
> 2) are `MACRO:`s allowed to have invalid stack effect declaration? Are
> they somehow exempted from the compiler checks?
>
> I'm asking this because the declared stack effect shows up in the
> documentation, and is confusing. Reading it gives the expression that it
> should be used with an extra `call` to the produced quotation:
> `11 "he%do, world" printf call`
>
> 18.01.2018, 19:00, "John Benediktsson" :
>
> Both of those are macros (basically special words that produce a
> quotation), so when "called" they are first macro-expanded into a quotation
> and then that quotation is called, with whatever stack effect it has.
>
> IN: scratchpad 1 2 3 "%s %s %s" printf
> 1 2 3
>
> IN: scratchpad [ "%s %s %s" printf ] infer
> ( x x x -- )
>
> IN: scratchpad [ "%s %s %s" printf ] expand-macros
> [
> [ present ] 2 ndip [ " " ] 2 ndip [ present ] 1 ndip
> [ " " ] 1 ndip [ present ] 0 ndip output-stream get
> [ stream-write ] curry 5 napply
> ]
>
> Maybe the article I wrote when developing it would help:
>
> https://re-factor.blogspot.com/2011/08/printf.html
>
>
> On Thu, Jan 18, 2018 at 4:32 AM, Alexander Ilin  wrote:
>
> Hello!
>
>   There are two similar words: printf and sprintf. They have similar stack
> effects, but different behavior.
>
> MACRO: sprintf ( format-string -- result )
> leaves a string on stack
>
> MACRO: printf ( format-string -- quot )
> leaves nothing on stack despite the stack effect specified
>
>   How come `printf` does'n obey its declared stack effect?
>
> ---=---
>  Александр
>
>
>
> ---=---
> Александр
>
>
> --
> Check out the vibrant tech community on one of the world's most
> engaging tech sites, Slashdot.org! http://sdm.link/slashdot
> ___
> Factor-talk mailing list
> Factor-talk@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/factor-talk
>
> ,
>
>
> --
> Check out the vibrant tech community on one of the world's most
> engaging tech sites, Slashdot.org! http://sdm.link/slashdot
>
> ,
>
> ___
> Factor-talk mailing list
> Factor-talk@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/factor-talk
>
>
>
> ---=---
> Александр
>
>
> --
> Check out the vibrant tech community on one of the world's most
> engaging tech sites, Slashdot.org! http://sdm.link/slashdot
> ___
> Factor-talk mailing list
> Factor-talk@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/factor-talk
>
--
Check out the vibrant 

Re: [Factor-talk] printf documentation

2018-01-18 Thread Alexander Ilin
Can I simply change the stack effects for the purposes of documenting them like this?```MACRO: printf ( ... string -- )MACRO: sprintf ( ... string -- result )```  18.01.2018, 23:44, "Doug Coleman" :Stack effects on macros are not checked. We have the convention of lying that the stack effect is ( input -- quot ) but even that is wrong, as the macro is called immediately so you don't get a quot on the stack. The quot could have a stack effect of its own but it's variable arity, as you are seeing with printf. If you have a way to resolve this, lemme know! (One idea is "input-only stack effects" which don't have an output, so you could do ``MACRO: printf ( string ) ... ;``) On Thu, Jan 18, 2018 at 2:36 PM Alexander Ilin  wrote:O-kay... Let me try to ask my question again... I've read the blog post that you linked to. In there I found the following declaration:`MACRO: printf ( format-string -- )` This means that the macro takes one argument and removes it from the stack, doesn't put anything back. But in the actual source code of the `formatting` vocab the declaration is: `MACRO: printf ( format-string -- quot )`, which looks as if the `printf` word takes one parameter off the stack and puts one item back on the stack. ... which is not true: it doesn't put a quotation on the stack, because it calls the quotation. So, I have two questions, basically: 1) why not change the declaration in `formatting` to ``MACRO: printf ( format-string -- )` - with no output onto the stack?2) are `MACRO:`s allowed to have invalid stack effect declaration? Are they somehow exempted from the compiler checks? I'm asking this because the declared stack effect shows up in the documentation, and is confusing. Reading it gives the _expression_ that it should be used with an extra `call` to the produced quotation:`11 "he%do, world" printf call` 18.01.2018, 19:00, "John Benediktsson" :Both of those are macros (basically special words that produce a quotation), so when "called" they are first macro-expanded into a quotation and then that quotation is called, with whatever stack effect it has. IN: scratchpad 1 2 3 "%s %s %s" printf1 2 3 IN: scratchpad [ "%s %s %s" printf ] infer( x x x -- ) IN: scratchpad [ "%s %s %s" printf ] expand-macros[    [ present ] 2 ndip [ " " ] 2 ndip [ present ] 1 ndip    [ " " ] 1 ndip [ present ] 0 ndip output-stream get    [ stream-write ] curry 5 napply] Maybe the article I wrote when developing it would help: https://re-factor.blogspot.com/2011/08/printf.html  On Thu, Jan 18, 2018 at 4:32 AM, Alexander Ilin  wrote:Hello!  There are two similar words: printf and sprintf. They have similar stack effects, but different behavior.MACRO: sprintf ( format-string -- result )leaves a string on stackMACRO: printf ( format-string -- quot )leaves nothing on stack despite the stack effect specified  How come `printf` does'n obey its declared stack effect?---=--- Александр  ---=---Александр --Check out the vibrant tech community on one of the world's mostengaging tech sites, Slashdot.org! http://sdm.link/slashdot___Factor-talk mailing listFactor-talk@lists.sourceforge.nethttps://lists.sourceforge.net/lists/listinfo/factor-talk,--Check out the vibrant tech community on one of the world's mostengaging tech sites, Slashdot.org! http://sdm.link/slashdot,___Factor-talk mailing listFactor-talk@lists.sourceforge.nethttps://lists.sourceforge.net/lists/listinfo/factor-talk  ---=---Александр --
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot___
Factor-talk mailing list
Factor-talk@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/factor-talk


Re: [Factor-talk] printf documentation

2018-01-18 Thread Doug Coleman
Stack effects on macros are not checked. We have the convention of lying
that the stack effect is ( input -- quot ) but even that is wrong, as the
macro is called immediately so you don't get a quot on the stack. The quot
could have a stack effect of its own but it's variable arity, as you are
seeing with printf. If you have a way to resolve this, lemme know!

(One idea is "input-only stack effects" which don't have an output, so you
could do ``MACRO: printf ( string ) ... ;``)

On Thu, Jan 18, 2018 at 2:36 PM Alexander Ilin  wrote:

> O-kay... Let me try to ask my question again...
>
> I've read the blog post that you linked to. In there I found the following
> declaration:
> `*MACRO:* printf ( format-string -- )`
>
> This means that the macro takes one argument and removes it from the
> stack, doesn't put anything back.
>
> But in the actual source code of the `formatting` vocab the declaration
> is: `MACRO: printf ( format-string -- quot )`, which looks as if the
> `printf` word takes one parameter off the stack and puts one item back on
> the stack.
>
> ... which is not true: it doesn't put a quotation on the stack, because it
> calls the quotation.
>
> So, I have two questions, basically:
>
> 1) why not change the declaration in `formatting` to ``MACRO: printf (
> format-string -- )` - with no output onto the stack?
> 2) are `MACRO:`s allowed to have invalid stack effect declaration? Are
> they somehow exempted from the compiler checks?
>
> I'm asking this because the declared stack effect shows up in the
> documentation, and is confusing. Reading it gives the expression that it
> should be used with an extra `call` to the produced quotation:
> `11 "he%do, world" printf call`
>
> 18.01.2018, 19:00, "John Benediktsson" :
>
> Both of those are macros (basically special words that produce a
> quotation), so when "called" they are first macro-expanded into a quotation
> and then that quotation is called, with whatever stack effect it has.
>
> IN: scratchpad 1 2 3 "%s %s %s" printf
> 1 2 3
>
> IN: scratchpad [ "%s %s %s" printf ] infer
> ( x x x -- )
>
> IN: scratchpad [ "%s %s %s" printf ] expand-macros
> [
> [ present ] 2 ndip [ " " ] 2 ndip [ present ] 1 ndip
> [ " " ] 1 ndip [ present ] 0 ndip output-stream get
> [ stream-write ] curry 5 napply
> ]
>
> Maybe the article I wrote when developing it would help:
>
> https://re-factor.blogspot.com/2011/08/printf.html
>
>
> On Thu, Jan 18, 2018 at 4:32 AM, Alexander Ilin  wrote:
>
> Hello!
>
>   There are two similar words: printf and sprintf. They have similar stack
> effects, but different behavior.
>
> MACRO: sprintf ( format-string -- result )
> leaves a string on stack
>
> MACRO: printf ( format-string -- quot )
> leaves nothing on stack despite the stack effect specified
>
>   How come `printf` does'n obey its declared stack effect?
>
> ---=---
>  Александр
>
>
>
> ---=---
> Александр
>
>
> --
> Check out the vibrant tech community on one of the world's most
> engaging tech sites, Slashdot.org! http://sdm.link/slashdot
> ___
> Factor-talk mailing list
> Factor-talk@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/factor-talk
>
--
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot___
Factor-talk mailing list
Factor-talk@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/factor-talk


Re: [Factor-talk] printf documentation

2018-01-18 Thread Alexander Ilin
O-kay... Let me try to ask my question again... I've read the blog post that you linked to. In there I found the following declaration:`MACRO: printf ( format-string -- )` This means that the macro takes one argument and removes it from the stack, doesn't put anything back. But in the actual source code of the `formatting` vocab the declaration is: `MACRO: printf ( format-string -- quot )`, which looks as if the `printf` word takes one parameter off the stack and puts one item back on the stack. ... which is not true: it doesn't put a quotation on the stack, because it calls the quotation. So, I have two questions, basically: 1) why not change the declaration in `formatting` to ``MACRO: printf ( format-string -- )` - with no output onto the stack?2) are `MACRO:`s allowed to have invalid stack effect declaration? Are they somehow exempted from the compiler checks? I'm asking this because the declared stack effect shows up in the documentation, and is confusing. Reading it gives the _expression_ that it should be used with an extra `call` to the produced quotation:`11 "he%do, world" printf call` 18.01.2018, 19:00, "John Benediktsson" :Both of those are macros (basically special words that produce a quotation), so when "called" they are first macro-expanded into a quotation and then that quotation is called, with whatever stack effect it has. IN: scratchpad 1 2 3 "%s %s %s" printf1 2 3 IN: scratchpad [ "%s %s %s" printf ] infer( x x x -- ) IN: scratchpad [ "%s %s %s" printf ] expand-macros[    [ present ] 2 ndip [ " " ] 2 ndip [ present ] 1 ndip    [ " " ] 1 ndip [ present ] 0 ndip output-stream get    [ stream-write ] curry 5 napply] Maybe the article I wrote when developing it would help: https://re-factor.blogspot.com/2011/08/printf.html  On Thu, Jan 18, 2018 at 4:32 AM, Alexander Ilin  wrote:Hello!  There are two similar words: printf and sprintf. They have similar stack effects, but different behavior.MACRO: sprintf ( format-string -- result )leaves a string on stackMACRO: printf ( format-string -- quot )leaves nothing on stack despite the stack effect specified  How come `printf` does'n obey its declared stack effect?---=--- Александр  ---=---Александр --
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot___
Factor-talk mailing list
Factor-talk@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/factor-talk


[Factor-talk] printf documentation

2018-01-18 Thread Alexander Ilin
Hello!

  There are two similar words: printf and sprintf. They have similar stack 
effects, but different behavior.

MACRO: sprintf ( format-string -- result )
leaves a string on stack

MACRO: printf ( format-string -- quot )
leaves nothing on stack despite the stack effect specified 

  How come `printf` does'n obey its declared stack effect?

---=--- 
 Александр


--
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
___
Factor-talk mailing list
Factor-talk@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/factor-talk