Автор |
Сообщение |
|
|
Заголовок сообщения: |
Re: Учимся на примерах... |
|
|
VoidVolker писал(а): ArtemKAD писал(а): Тогда уж локалсы до конца использовать А смысл-то гонять туда-сюда по памяти данные, когда они нужны только один раз для цикла? Так локальные переменные нужны не для цикла, а для программиста. Что-бы не заниматься без повода стековой акробатикой. Единственная их цель - наглядность.
[quote="VoidVolker"][quote="ArtemKAD"]Тогда уж локалсы до конца использовать[/quote] А смысл-то гонять туда-сюда по памяти данные, когда они нужны только один раз для цикла?[/quote] Так локальные переменные нужны не для цикла, а для программиста. Что-бы не заниматься без повода стековой акробатикой. Единственная их цель - наглядность.
|
|
|
|
Добавлено: Чт дек 27, 2012 13:21 |
|
|
|
|
|
Заголовок сообщения: |
Re: Учимся на примерах... |
|
|
ArtemKAD писал(а): Тогда уж локалсы до конца использовать А смысл-то гонять туда-сюда по памяти данные, когда они нужны только один раз для цикла?
[quote="ArtemKAD"]Тогда уж локалсы до конца использовать[/quote] А смысл-то гонять туда-сюда по памяти данные, когда они нужны только один раз для цикла?
|
|
|
|
Добавлено: Чт дек 27, 2012 08:53 |
|
|
|
|
|
Заголовок сообщения: |
Re: Учимся на примерах... |
|
|
transl/ useful.fts transl/ numbers.fts branch/ triple.fts
VARIABLE positive VARIABLE negative VARIABLE zero
\ : show ( --> ) ." \n\rнулей:\t\t" zero @ . ." \n\rположительных:\t" positive @ . ." \n\rотрицательных:\t" negative @ . ;
\ : next ( n --> ) ' EXECUTE ZER 1 zero POS 1 positive NEG 1 negative SEL +! ;
ToAll next 1 -1 -3 4 0 5 -6 -7 9
show
[pre][b][color=#00F000]transl/ useful.fts[/color] [color=#00F000]transl/ numbers.fts[/color] [color=#00F000]branch/ triple.fts[/color]
[color=#FF8000]VARIABLE positive[/color] [color=#FF8000]VARIABLE negative[/color] [color=#FF8000]VARIABLE zero[/color]
[color=#808080]\[/color] [color=#FF8000]: show[/color] [color=#0080C0]( --> )[/color] [color=#00F000]." \n\rнулей:\t\t"[/color] zero @ . [color=#00F000]." \n\rположительных:\t"[/color] positive @ . [color=#00F000]." \n\rотрицательных:\t"[/color] negative @ . [color=#FF8000];[/color]
[color=#808080]\[/color] [color=#FF8000]: next[/color] [color=#0080C0]( n --> )[/color] ' [color=#C00000]EXECUTE[/color] ZER [color=#00F000]1[/color] zero POS [color=#00F000]1[/color] positive NEG [color=#00F000]1[/color] negative SEL +! [color=#FF8000];[/color]
ToAll next [color=#00F000]1[/color] [color=#00F000]-1[/color] [color=#00F000]-3[/color] [color=#00F000]4[/color] [color=#00F000]0[/color] [color=#00F000]5[/color] [color=#00F000]-6[/color] [color=#00F000]-7[/color] [color=#00F000]9[/color]
show [/b][/pre]
|
|
|
|
Добавлено: Чт дек 27, 2012 05:14 |
|
|
|
|
|
Заголовок сообщения: |
Re: Учимся на примерах... |
|
|
VoidVolker писал(а): Код: : each: R> { xt -- } \ ( array -- ) DUP CELL+ DUP ROT @ CELLS + SWAP DO I @ xt EXECUTE CELL +LOOP ; Тогда уж локалсы до конца использовать Код: : each: R> { array xt -- } array @ \ число элементов array CELL+ TO array \ начало массива array CELLS + array DO I @ xt EXECUTE CELL +LOOP ;
[quote="VoidVolker"][code]: each: R> { xt -- } \ ( array -- ) DUP CELL+ DUP ROT @ CELLS + SWAP DO I @ xt EXECUTE CELL +LOOP ;[/code][/quote] Тогда уж локалсы до конца использовать [code]: each: R> { array xt -- } array @ \ число элементов array CELL+ TO array \ начало массива array CELLS + array DO I @ xt EXECUTE CELL +LOOP ;[/code]
|
|
|
|
Добавлено: Чт дек 27, 2012 02:51 |
|
|
|
|
|
Заголовок сообщения: |
Re: Учимся на примерах... |
|
|
Код: : each: R> { xt -- } \ ( array -- ) DUP CELL+ DUP ROT @ CELLS + SWAP DO I @ xt EXECUTE CELL +LOOP ;
[code]: each: R> { xt -- } \ ( array -- ) DUP CELL+ DUP ROT @ CELLS + SWAP DO I @ xt EXECUTE CELL +LOOP ;[/code]
|
|
|
|
Добавлено: Ср дек 26, 2012 19:44 |
|
|
|
|
|
Заголовок сообщения: |
Re: Учимся на примерах... |
|
|
Alex писал(а): ух ты ..... речь скорее была про этот пример Код: 0 VALUE level : sum> ( lev,arr -- sum) SWAP TO level 0 SWAP each: DUP level > IF + ELSE DROP THEN ; 4 arr sum> . ( 14 ) Да...Эта конструкция веселее. Особенно из-за того, что ; должна убрать кадр со стека и вместе с тем, должна его оставить. Пока на ум пришол только обрезанный вариант. Код: CREATE arr 9 , 1 , -1 , -3 , 4 , 0 , 5 , -6 , -7 , 9 , : each2: R> { level array xt -- } 0 \ иннициализирую sum начальным значением array @ 0 DO array CELL+ TO array array @ level xt EXECUTE LOOP ; : test { sum n lev -- sum } n lev > IF sum n + ELSE sum THEN ;
: sum> ( lev a -- ) each2: test ;
4 arr sum> .
Кстати, логичным из него результатом станет преврещение each2: в слово немедленного исполнение которое вставляет в цикл следующее за ним слово. Заодно и исчезает не переносимый хак со стеком возвратов.
[quote="Alex"]ух ты ..... речь скорее была про этот пример [code]0 VALUE level : sum> ( lev,arr -- sum) SWAP TO level 0 SWAP each: DUP level > IF + ELSE DROP THEN ; 4 arr sum> . ( 14 )[/code] [/quote] Да...Эта конструкция веселее. Особенно из-за того, что ; должна убрать кадр со стека и вместе с тем, должна его оставить. Пока на ум пришол только обрезанный вариант. [code]CREATE arr 9 , 1 , -1 , -3 , 4 , 0 , 5 , -6 , -7 , 9 , : each2: R> { level array xt -- } 0 \ иннициализирую sum начальным значением array @ 0 DO array CELL+ TO array array @ level xt EXECUTE LOOP ; : test { sum n lev -- sum } n lev > IF sum n + ELSE sum THEN ;
: sum> ( lev a -- ) each2: test ;
4 arr sum> . [/code]
Кстати, логичным из него результатом станет преврещение each2: в слово немедленного исполнение которое вставляет в цикл следующее за ним слово. Заодно и исчезает не переносимый хак со стеком возвратов.
|
|
|
|
Добавлено: Ср дек 26, 2012 18:37 |
|
|
|
|
|
Заголовок сообщения: |
Re: Учимся на примерах... |
|
|
ух ты ..... речь скорее была про этот пример Код: 0 VALUE level : sum> ( lev,arr -- sum) SWAP TO level 0 SWAP each: DUP level > IF + ELSE DROP THEN ; 4 arr sum> . ( 14 ) но Ваш спoсоб позволяет гораздо проще делать спецефические итераторы, можно и так смухлевать Код: S" locals.f" INCLUDED CREATE arr 9 , 1 , -1 , -3 , 4 , 0 , 5 , -6 , -7 , 9 , : each: R> { level array xt -- } array @ 0 DO array CELL+ TO array array @ level xt EXECUTE LOOP ; : sum> ( lev,arr -- sum) 0 -ROT each: OVER SWAP > IF + ELSE DROP THEN ;
4 arr sum> . (14) а как бы здесь хорошо смотрелась та штука , о которой говорил true-grue Код: : sum> ( lev,arr -- sum) 0 -ROT each: { node level - node node level } > IF + ELSE DROP THEN ;
ух ты ..... речь скорее была про этот пример [code]0 VALUE level : sum> ( lev,arr -- sum) SWAP TO level 0 SWAP each: DUP level > IF + ELSE DROP THEN ; 4 arr sum> . ( 14 )[/code] но Ваш спoсоб позволяет гораздо проще делать спецефические итераторы, можно и так смухлевать [code]S" locals.f" INCLUDED CREATE arr 9 , 1 , -1 , -3 , 4 , 0 , 5 , -6 , -7 , 9 , : each: R> { level array xt -- } array @ 0 DO array CELL+ TO array array @ level xt EXECUTE LOOP ; : sum> ( lev,arr -- sum) 0 -ROT each: OVER SWAP > IF + ELSE DROP THEN ;
4 arr sum> . (14)[/code] а как бы здесь хорошо смотрелась та штука , о которой говорил true-grue [code]: sum> ( lev,arr -- sum) 0 -ROT each: { node level - node node level } > IF + ELSE DROP THEN ;[/code]
|
|
|
|
Добавлено: Ср дек 26, 2012 15:14 |
|
|
|
|
|
Заголовок сообщения: |
Re: Учимся на примерах... |
|
|
true-grue писал(а): Вместо этого стоило бы просто попытать силы в примерах выше с использованием локальных переменных. Да в чем проблема... Пример от Alex Код: CREATE arr 9 , 1 , -1 , -3 , 4 , 0 , 5 , -6 , -7 , 9 , : each: ( array) ( 0 arr -- ) R> ( 0 arr xt -- ) SWAP DUP @ >R CELL+ R> ( 0 xt arr+ cnt -- ) 0 DO 2DUP 2>R ( 0 xt arr+ R: xt arr+ ) @ SWAP EXECUTE ( 0 n xt -- ) 2R> CELL+ ( num xt arr+ -- ) LOOP 2DROP ;
: negatives ( array - count) 0 SWAP each: 0< IF 1+ THEN ; : zeroes ( array - count) 0 SWAP each: 0= IF 1+ THEN ; : positives ( array - count) 0 SWAP each: 0 > IF 1+ THEN ;
: main CR ." Negatives=" arr negatives . CR ." Zeroes=" arr zeroes . CR ." Positives=" arr positives . ;
Аналог с локальными переменными: Код: CREATE arr 9 , 1 , -1 , -3 , 4 , 0 , 5 , -6 , -7 , 9 , : each: R> { array xt -- } array @ 0 DO array CELL+ TO array array @ xt EXECUTE LOOP ;
: negatives ( array - count) 0 SWAP each: 0< IF 1+ THEN ; : zeroes ( array - count) 0 SWAP each: 0= IF 1+ THEN ; : positives ( array - count) 0 SWAP each: 0 > IF 1+ THEN ;
: main CR ." Negatives=" arr negatives . CR ." Zeroes=" arr zeroes . CR ." Positives=" arr positives . ;
Написано для любителей Си
[quote="true-grue"] [b]Вместо этого стоило бы просто попытать силы в примерах выше с использованием локальных переменных[/b].[/quote]
Да в чем проблема... Пример от Alex [code]CREATE arr 9 , 1 , -1 , -3 , 4 , 0 , 5 , -6 , -7 , 9 , : each: ( array) ( 0 arr -- ) R> ( 0 arr xt -- ) SWAP DUP @ >R CELL+ R> ( 0 xt arr+ cnt -- ) 0 DO 2DUP 2>R ( 0 xt arr+ R: xt arr+ ) @ SWAP EXECUTE ( 0 n xt -- ) 2R> CELL+ ( num xt arr+ -- ) LOOP 2DROP ;
: negatives ( array - count) 0 SWAP each: 0< IF 1+ THEN ; : zeroes ( array - count) 0 SWAP each: 0= IF 1+ THEN ; : positives ( array - count) 0 SWAP each: 0 > IF 1+ THEN ;
: main CR ." Negatives=" arr negatives . CR ." Zeroes=" arr zeroes . CR ." Positives=" arr positives . ; [/code]
Аналог с локальными переменными: [code] CREATE arr 9 , 1 , -1 , -3 , 4 , 0 , 5 , -6 , -7 , 9 , : each: R> { array xt -- } array @ 0 DO array CELL+ TO array array @ xt EXECUTE LOOP ;
: negatives ( array - count) 0 SWAP each: 0< IF 1+ THEN ; : zeroes ( array - count) 0 SWAP each: 0= IF 1+ THEN ; : positives ( array - count) 0 SWAP each: 0 > IF 1+ THEN ;
: main CR ." Negatives=" arr negatives . CR ." Zeroes=" arr zeroes . CR ." Positives=" arr positives . ; [/code] Написано для любителей Си ;-)
|
|
|
|
Добавлено: Ср дек 26, 2012 14:39 |
|
|
|
|
|
Заголовок сообщения: |
Re: Учимся на примерах... |
|
|
mOleg писал(а): true-grue писал(а): Еще раз поясню: меня сейчас локальные переменные не интересуют. Ни в каком виде. аналогично. хотя, таки, без категоричностей (надо - буду использовать, но только там, где надо). Понятное дело. Под "сейчас" я подразумевал наше обсуждение с each: и прочим.
[quote="mOleg"][quote="true-grue"]Еще раз поясню: меня сейчас локальные переменные не интересуют. Ни в каком виде.[/quote] аналогично. хотя, таки, без категоричностей (надо - буду использовать, но только там, где надо).[/quote]
Понятное дело. Под "сейчас" я подразумевал наше обсуждение с each: и прочим.
|
|
|
|
Добавлено: Вт дек 25, 2012 16:42 |
|
|
|
|
|
Заголовок сообщения: |
Re: Учимся на примерах... |
|
|
true-grue писал(а): Еще раз поясню: меня сейчас локальные переменные не интересуют. Ни в каком виде. аналогично. хотя, таки, без категоричностей (надо - буду использовать, но только там, где надо).
[quote="true-grue"]Еще раз поясню: меня сейчас локальные переменные не интересуют. Ни в каком виде.[/quote] аналогично. хотя, таки, без категоричностей (надо - буду использовать, но только там, где надо).
|
|
|
|
Добавлено: Вт дек 25, 2012 16:41 |
|
|
|
|
|
Заголовок сообщения: |
Re: Учимся на примерах... |
|
|
mOleg писал(а): true-grue писал(а): . Предлагаю рассмотреть следующее несложное решение. viewtopic.php?p=34749#p34749Очередную реализацию локальных переменных и решение примеров выше на ее основе пусть показывают поклонники этих самых локальных переменных. Еще раз поясню: меня сейчас локальные переменные не интересуют. Ни в каком виде. В данном случае я совершенно солидарен с сообщением покинувшего нас г-на gudleifr'а по ссылке
[quote="mOleg"][quote="true-grue"]. Предлагаю рассмотреть следующее несложное решение.[/quote] http://fforum.winglion.ru/viewtopic.php?p=34749#p34749[/quote]
Очередную реализацию локальных переменных и решение примеров выше на ее основе пусть показывают поклонники этих самых локальных переменных. Еще раз поясню: меня сейчас локальные переменные не интересуют. Ни в каком виде. В данном случае я совершенно солидарен с сообщением покинувшего нас г-на gudleifr'а по ссылке :)
|
|
|
|
Добавлено: Вт дек 25, 2012 16:38 |
|
|
|
|
|
Заголовок сообщения: |
Re: Учимся на примерах... |
|
|
true-grue писал(а): . Предлагаю рассмотреть следующее несложное решение. viewtopic.php?p=34749#p34749
[quote="true-grue"]. Предлагаю рассмотреть следующее несложное решение.[/quote] http://fforum.winglion.ru/viewtopic.php?p=34749#p34749
|
|
|
|
Добавлено: Вт дек 25, 2012 16:32 |
|
|
|
|
|
Заголовок сообщения: |
Re: Учимся на примерах... |
|
|
true-grue писал(а): ArtemKAD писал(а): В чем "слишком много ограничений"? "Загрязнение" стека возвратов, невозможность их введения внутри управляющих конструкций... Стек возвратов там "постольку поскольку" - это просто удобное место под временный буфер. Введите отдельный стек и не будет загрязнения. Там ведь абсолютная адресация памяти ячейки во временном буфере. В чем проблема с управляющими конструкциями? Кроме досточтимого DO - LOOP остальные вроде на стек возвратов не покушаются и доработок не требуют...
[quote="true-grue"][quote="ArtemKAD"]В чем "слишком много ограничений"?[/quote] "Загрязнение" стека возвратов, невозможность их введения внутри управляющих конструкций... [/quote] Стек возвратов там "постольку поскольку" - это просто удобное место под временный буфер. Введите отдельный стек и не будет загрязнения. Там ведь абсолютная адресация памяти ячейки во временном буфере.
В чем проблема с управляющими конструкциями? Кроме досточтимого DO - LOOP остальные вроде на стек возвратов не покушаются и доработок не требуют...
|
|
|
|
Добавлено: Вт дек 25, 2012 16:19 |
|
|
|
|
|
Заголовок сообщения: |
Re: Учимся на примерах... |
|
|
ArtemKAD писал(а): В чем "слишком много ограничений"? "Загрязнение" стека возвратов, невозможность их введения внутри управляющих конструкций... Ох, Вы хотя бы представляете, сколько лет этому банальному вопросу? Если просто погуглить, можно наткнуться на массу обсуждений недостатков локальных переменных. Зачем было копировать сюда файлик, который и так есть у большинства фортеров? Вместо этого стоило бы просто попытать силы в примерах выше с использованием локальных переменных.
[quote="ArtemKAD"]В чем "слишком много ограничений"?[/quote] "Загрязнение" стека возвратов, невозможность их введения внутри управляющих конструкций... Ох, Вы хотя бы представляете, сколько лет этому банальному вопросу? Если просто погуглить, можно наткнуться на массу обсуждений недостатков локальных переменных. Зачем было копировать сюда файлик, который и так есть у большинства фортеров? [b]Вместо этого стоило бы просто попытать силы в примерах выше с использованием локальных переменных[/b].
|
|
|
|
Добавлено: Вт дек 25, 2012 14:27 |
|
|
|
|
|
Заголовок сообщения: |
Re: Учимся на примерах... |
|
|
По моему все вопросы давно сняты в locals.f из SPF. Комментарий оттуда (занимает аж треть всей реализации) Код: ( Простое расширение СП-Форта локальными переменными. Реализовано без использования LOCALS стандарта 94.
Объявление временных переменных, видимых только внутри текущего слова и ограниченных временем вызова данного слова выполняется с помощью слова "{". Внутри определения слова используется конструкция, подобная стековой нотации Форта { список_инициализированных_локалов \ сп.неиниц.локалов -- что угодно } Например:
{ a b c d \ e f -- i j }
Или { a b c d \ e f[ EVALUATE_выражение ] -- i j } Это значит что для переменной f[ будет выделен на стеке возвратов участок памяти длиной n байт. Использование переменной f[ даст адрес начала этого участка. \В стиле MPE\
Или { a b c d \ e [ 12 ] f -- i j } Это значит что для переменной f будет выделен на стеке возвратов участок памяти длиной 12 байт. Использование переменной f даст адрес начала этого участка.
Часть "\ сп.неиниц.локалов" может отсутствовать, например:
{ item1 item2 -- }
Это заставляет СП-Форт автоматически выделять место в стеке возвратов для этих переменных в момент вызова слова и автоматически освобождать место при выходе из него.
Обращение к таким локальным переменным - как к VALUE-переменным по имени. Если нужен адрес переменной, то используется "^ имя" или "AT имя".
Вместо \ можно использовать | Вместо -> можно использовать TO
Примеры:
: TEST { a b c d \ e f -- } a . b . c . b c + -> e e . f . ^ a @ . ; Ok 1 2 3 4 TEST 1 2 3 5 0 1 Ok
: TEST { a b -- } a . b . CR 5 0 DO I . a . b . CR LOOP ; Ok 12 34 TEST 12 34 0 12 34 1 12 34 2 12 34 3 12 34 4 12 34 Ok
: TEST { a b } a . b . ; Ok 1 2 TEST 1 2 Ok
: TEST { a b \ c } a . b . c . ; Ok 1 2 TEST 1 2 0 Ok
: TEST { a b -- } a . b . ; Ok 1 2 TEST 1 2 Ok
: TEST { a b \ c -- d } a . b . c . ; Ok 1 2 TEST 1 2 0 Ok
: TEST { \ a b } a . b . 1 -> a 2 -> b a . b . ; Ok TEST 0 0 1 2 Ok
Имена локальных переменных существуют в динамическом временном словаре только в момент компиляции слова, а после этого вычищаются и более недоступны.
Использовать конструкцию "{ ... }" внутри одного определения можно только один раз.
Компиляция этой библиотеки добавляет в текущий словарь компиляции Только два слова: словарь "vocLocalsSupport" и "{" Все остальные детали "спрятаны" в словаре, использовать их не рекомендуется. )
В чем "слишком много ограничений"?
По моему все вопросы давно сняты в locals.f из SPF. Комментарий оттуда (занимает аж треть всей реализации) [code]( Простое расширение СП-Форта локальными переменными. Реализовано без использования LOCALS стандарта 94.
Объявление временных переменных, видимых только внутри текущего слова и ограниченных временем вызова данного слова выполняется с помощью слова "{". Внутри определения слова используется конструкция, подобная стековой нотации Форта { список_инициализированных_локалов \ сп.неиниц.локалов -- что угодно } Например:
{ a b c d \ e f -- i j }
Или { a b c d \ e f[ EVALUATE_выражение ] -- i j } Это значит что для переменной f[ будет выделен на стеке возвратов участок памяти длиной n байт. Использование переменной f[ даст адрес начала этого участка. \В стиле MPE\
Или { a b c d \ e [ 12 ] f -- i j } Это значит что для переменной f будет выделен на стеке возвратов участок памяти длиной 12 байт. Использование переменной f даст адрес начала этого участка.
Часть "\ сп.неиниц.локалов" может отсутствовать, например:
{ item1 item2 -- }
Это заставляет СП-Форт автоматически выделять место в стеке возвратов для этих переменных в момент вызова слова и автоматически освобождать место при выходе из него.
Обращение к таким локальным переменным - как к VALUE-переменным по имени. Если нужен адрес переменной, то используется "^ имя" или "AT имя".
Вместо \ можно использовать | Вместо -> можно использовать TO
Примеры:
: TEST { a b c d \ e f -- } a . b . c . b c + -> e e . f . ^ a @ . ; Ok 1 2 3 4 TEST 1 2 3 5 0 1 Ok
: TEST { a b -- } a . b . CR 5 0 DO I . a . b . CR LOOP ; Ok 12 34 TEST 12 34 0 12 34 1 12 34 2 12 34 3 12 34 4 12 34 Ok
: TEST { a b } a . b . ; Ok 1 2 TEST 1 2 Ok
: TEST { a b \ c } a . b . c . ; Ok 1 2 TEST 1 2 0 Ok
: TEST { a b -- } a . b . ; Ok 1 2 TEST 1 2 Ok
: TEST { a b \ c -- d } a . b . c . ; Ok 1 2 TEST 1 2 0 Ok
: TEST { \ a b } a . b . 1 -> a 2 -> b a . b . ; Ok TEST 0 0 1 2 Ok
Имена локальных переменных существуют в динамическом временном словаре только в момент компиляции слова, а после этого вычищаются и более недоступны.
Использовать конструкцию "{ ... }" внутри одного определения можно только один раз.
Компиляция этой библиотеки добавляет в текущий словарь компиляции Только два слова: словарь "vocLocalsSupport" и "{" Все остальные детали "спрятаны" в словаре, использовать их не рекомендуется. ) [/code]
В чем "слишком много ограничений"?
|
|
|
|
Добавлено: Вт дек 25, 2012 14:12 |
|
|
|
|