Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Пт мар 29, 2024 18:20

...
Google Search
Forth-FAQ Spy Grafic

Часовой пояс: UTC + 3 часа [ Летнее время ]




Ответить
Имя пользователя:
Заголовок:
Текст сообщения:
Введите текст вашего сообщения. Длина сообщения в символах не более: 60000

Размер шрифта:
Цвет шрифта
Настройки:
BBCode ВКЛЮЧЕН
[img] ВЫКЛЮЧЕН
[flash] ВЫКЛЮЧЕН
[url] ВКЛЮЧЕН
Смайлики ВЫКЛЮЧЕНЫ
Отключить в этом сообщении BBCode
Не преобразовывать адреса URL в ссылки
Вопрос
Теперь гостю придется вводить здесь пароль. Не от своей учетной записи, а ПАРОЛЬ ДЛЯ ГОСТЯ, получить который можно после регистрации на форуме через ЛС.:
Этот вопрос предназначен для выявления и предотвращения автоматических регистраций.
   

Обзор темы - Уголок чайника.
Автор Сообщение
  Заголовок сообщения:   Ответить с цитатой
Если не секрет, для чего нужно так много элементов продублировать?

: 5DUP >R 2OVER R@ -ROT >R 2OVER R> -ROT R> ;
как вариант. Но лучше перепроектировать верхнее слово, так, чтобы этого делать не пришлось.
Просто делается : 4DUP 2OVER 2OVER ; дальше лучше заходить
Сообщение Добавлено: Вс авг 06, 2006 05:46
  Заголовок сообщения:   Ответить с цитатой
Вопрос: как бы мне сделать слово 5DUP? В принципе, я его уже сделал, однако хотелось бы не "лобовой" реализации.
Сообщение Добавлено: Вс авг 06, 2006 04:18
  Заголовок сообщения:   Ответить с цитатой
Cпасибо
Icefall
Infant
oleg
Сообщение Добавлено: Пн июл 24, 2006 23:53
  Заголовок сообщения:   Ответить с цитатой
oleg писал(а):
В книге написано что любую CONSTANT и VARIABLE мы можем забыть (FORGET)
Как должна вести себя система,если я забуду BASE -ведь могу,это же
переменная ?

Да, чуть не забыл. В форте нет переменых!) или констант.
Есть только слова, каждое из которых, знает только то, что должно знать.
Оно может не делать ничего, например быть маркером, а может выполнять очень сложные действия.

И насчет примеров, если хочешь конкретный правильный ответ то указывай систему, которая должна его исполнять.
oleg писал(а):
: * 2Dup 2.2 D= IF 2DROP 5 ELSE * THEN ;
на смал32 должен работать.
Сообщение Добавлено: Пн июл 24, 2006 00:07
  Заголовок сообщения:   Ответить с цитатой
WeTrust писал(а):
Цитата:
: 2 DUP 2 = IF DROP 1 ELSE 2 THEN ;

2 2 + .
3

Cорри.У меня этот пример не работает.(мне кажется что drop лишний).


Все верно. Я ошибся 8)
WeTrust писал(а):
Cорри.У меня этот пример не работает.(мне кажется что drop лишний).
Цитата:

: * 2Dup 2.2 D= IF 2DROP 5 ELSE * THEN ;

2 3 * .
6

2 2 * .
5

Получаю другие результаты. Не понимаю так же что такое 2.2.(ибо в стэк
в одной системе-Reva- ложится число 22,а в Small32-два числа 0 и 22 )

Гм. Должно бы класться число двойной длинны. Ладно, тогда просто 2 2
без точки между ними.
WeTrust писал(а):
В книге написано что любую CONSTANT и VARIABLE мы можем забыть (FORGET)
Как должна вести себя система,если я забуду BASE -ведь могу,это же
переменная ?


словарь форта это тоже стек. В классически реализовнных системах, которые имеют слово forget есть такое слово fence - которое определяет до куда можно делать forget - то есть дальше этого слова ( или адреса, который содержит это слово forget не идет). Смотри, каждое новое определение оказывается на вершине "стека-слов" ( это мое название, возможно не очень корректное)
Так или иначе забыть конкретное слово нельзя - можно забыть все слова определенные выше указанного вместе с ним. Вот есть ли оно в смал32 я не помню 8( Я не люблю пользоваться forget.
WeTrust писал(а):
если есть желание, могу оболочку к нему подарить.

Cпасибо.Отправляю адрес в ЛС.

не дошел 8( Повтори на oleg@simeiz.ylt.crimea.com
Сообщение Добавлено: Вс июл 23, 2006 22:59
  Заголовок сообщения:   Ответить с цитатой
WeTrust
То во что превратится 2- сильно зависит от того как разится входной поток на слова и числа. По идее должно превращаться в обычную двойку, если неопределено слово 2-.

По поводу слова FORGET. Оно позволяет "забывать" не конкретно какое-то слово, переменную или константу, а всё что было определено после этого слова. Обычно "забывают" слова собственного определения. Чтобы "слишком умные" пользователи не "позабывали" слова из базового словаря (Base относится именно к таким) действие слова Forget ограничивается вершиной словаря на момент запуска форт-системы (хотя и не обязательно).
Сообщение Добавлено: Вс июл 23, 2006 21:44
  Заголовок сообщения:   Ответить с цитатой
WeTrust писал(а):
Icefall
Цитата:
В reva нет слова 2-, поэтому оно интерпретируется как число 2.

Тут есть один тонкий момент.
Действительно help'a на это слово нет.
Но предположим что я ввожу новое слово
: ^s 2 depth 0 do drop loop ;
на него естественно тоже нет help'a но оно работает !
Когда мы вводим в Reva 4 2- это проглатывается будь здоров.
В отличие например от
ok> 4 2'
2'?
Т.е слово 2- не кажется инородным.Что же происходит с минусом ?

Смотрим исходники... При анализе строки учитываются следующие факторы:
* если последний символ - точка, число двойной длины;
* если первый символ минус - число отрицательное.
Остальные символы декодируются с учетом base по таблице fromdigits (файл reva.asm в исходниках). В ней некоторые символы обозначены как недопустимые, а некоторые - игнорируются. В число последних попадают точка и минус. Поэтому вполне допустимо писать извраты типа
Код:
-1.-.1.-.2.-.3.-.4.-
.s
-11234
:D
Сообщение Добавлено: Вс июл 23, 2006 21:30
  Заголовок сообщения:   Ответить с цитатой
Icefall
Цитата:
В reva нет слова 2-, поэтому оно интерпретируется как число 2.

Тут есть один тонкий момент.
Действительно help'a на это слово нет.
Но предположим что я ввожу новое слово
: ^s 2 depth 0 do drop loop ;
на него естественно тоже нет help'a но оно работает !
Когда мы вводим в Reva 4 2- это проглатывается будь здоров.
В отличие например от
ok> 4 2'
2'?
Т.е слово 2- не кажется инородным.Что же происходит с минусом ?

oleg
Цитата:
: 2 DUP 2 = IF DROP 1 ELSE 2 THEN ;

2 2 + .
3

Cорри.У меня этот пример не работает.(мне кажется что drop лишний).
Цитата:
: * 2Dup 2.2 D= IF 2DROP 5 ELSE * THEN ;

2 3 * .
6

2 2 * .
5

Получаю другие результаты. Не понимаю так же что такое 2.2.(ибо в стэк
в одной системе-Reva- ложится число 22,а в Small32-два числа 0 и 22 )

Цитата:
: 2 DUP 2 = IF DROP 1 ELSE 2 THEN ;

Тут логика понятна.Временно меняем базу,потом ее восстанавливаем.
В связи с этим вопрос.
В книге написано что любую CONSTANT и VARIABLE мы можем забыть (FORGET)
Как должна вести себя система,если я забуду BASE -ведь могу,это же
переменная ?

Цитата:
если есть желание, могу оболочку к нему подарить.

Cпасибо.Отправляю адрес в ЛС.
Сообщение Добавлено: Вс июл 23, 2006 17:26
  Заголовок сообщения:   Ответить с цитатой
Цитата:
Пример:
Reva 6.0 Windows

ok> 4 2- .s
(2) 4 2
ok>

В reva нет слова 2-, поэтому оно интерпретируется как число 2. Там вообще очень мало слов :). Набери words и убедись сам.
Сообщение Добавлено: Вс июл 23, 2006 13:15
  Заголовок сообщения:   Ответить с цитатой
WeTrust писал(а):
oleg
Вот смотрите (это Smal32):
>6 last1
2 - Ok
>10 last1
2 - Ok
>
Т.е для 6-ки единица вторая.
Для 10-ки единица вторая.
А потом...ловким движением руки
на 4-ке она превращается в элегантную 4-ку.
Наверно так и должно быть


6 = 0110
10 = 1010
4 = 0100
8) кстати можно и так сделать:

: .bin BASE @ 2 BASE ! SWAP . BASE ! ;

и тогда

10 .bin
1010
WeTrust писал(а):
Да.Как консоль.

если есть желание, могу оболочку к нему подарить.
WeTrust писал(а):
Пока для меня отнюдь не очевидно что if используя False
убирает его из стэка и не нужно делать DROP...


вообще форт старается где можно обходиться без слов dup drop.
Но без этих слов не всегда получается выразить алгоритм 8)
WeTrust писал(а):
Что параметры для DO то же
испаряются...

Вот циклы do loop я не люблю. Я бы их вообще выкинул из стандарта. Все прекрасно разруливается с помощью begin while until repeat again слов, а циклы с do loop пользуют стек возвратов и иногда усложняют жизнь.
WeTrust писал(а):
Пример:
Reva 6.0 Windows

ok> 4 2- .s
(2) 4 2
ok>

Пример(Small32)
>4 2- .s

Contents Of Stack
+------------------------------------------+
¦ ¦ Hex ¦ Decimal ¦ Octal ¦
¦----+----------+------------+-------------¦
¦ 0 ¦ 2 ¦ 2 ¦ 2 ¦
+------------------------------------------+
- Ok

непонятный и сомнительный пример 8) Одновременно
Если только ты не переопределил слово 2-, конечно. А то- это известная шутка:

: 2 DUP 2 = IF DROP 1 ELSE 2 THEN ;

2 2 + .
3

8)

Или так:

: * 2Dup 2.2 D= IF 2DROP 5 ELSE * THEN ;

2 3 * .
6

2 2 * .
5

%)))

WeTrust писал(а):
В одной системе после вычитания в стеке остается одно число,в другой-два.
Как же нет разницы ?


не должно у тебя такого получиться на стеке!
и еще в смале можно пользоваться s. иногда это удобнее.

WeTrust писал(а):
P.S. Cовсем не понимаю значения выражения "шитый код". Почему он шитый,а
не вязанный или не сплетенный ? .

Придумал не я 8) Так это называется.
Сообщение Добавлено: Вс июл 23, 2006 06:29
  Заголовок сообщения:   Ответить с цитатой
oleg
Вот смотрите (это Smal32):
>6 last1
2 - Ok
>10 last1
2 - Ok
>
Т.е для 6-ки единица вторая.
Для 10-ки единица вторая.
А потом...ловким движением руки
на 4-ке она превращается в элегантную 4-ку.
Наверно так и должно быть :)
Цитата:
Ты исследуешь СмАл32?

Да.Как консоль.
Пока для меня отнюдь не очевидно что if используя False
убирает его из стэка и не нужно делать DROP...
Что параметры для DO то же
испаряются...
Приглядываюсь..

Цитата:
ноги ростут от систем с использованием косвенного и прямого шитого кода, если у тебя такая система - то быстрее и короче получится если присать слитно, а для подпрограммного шитого кода может оказаться, что разницы нет никакой.


Пример:
Reva 6.0 Windows

ok> 4 2- .s
(2) 4 2
ok>

Пример(Small32)
>4 2- .s

Contents Of Stack
+------------------------------------------+
¦ ¦ Hex ¦ Decimal ¦ Octal ¦
¦----+----------+------------+-------------¦
¦ 0 ¦ 2 ¦ 2 ¦ 2 ¦
+------------------------------------------+
- Ok
>

В одной системе после вычитания в стэке остается одно число,в другой-два.
Как же нет разницы ?

P.S. Cовсем не понимаю значения выражения "шитый код". :roll: Почему он шитый,а
не вязанный или не сплетенный ? .
Сообщение Добавлено: Вс июл 23, 2006 06:01
  Заголовок сообщения:   Ответить с цитатой
WeTrust писал(а):
Вы привели пример четного 12.
А я говорил для 4 и 8.


0100
DUP .s
0100 0100
DUP .s
0100 0100 0100
1- .s
0100 0100 0011
XOR .s
0100 0111
AND .
0100

вот для 4-ех 8)

А это для 8-и
1000
DUP .s
1000 1000
DUP .s
1000 1000 1000
1- .s
1000 1000 0111
XOR .s
1000 1111
AND .
1000

WeTrust писал(а):
И последний значащий бит для
12 все таки будет 03,если для
нечетного они говорят 01.
(т.е вводят нумерацию с единицы).Да это число 4,но
как для числа 8 интерпретировать ответ 8 ?

Вероятно ты не то хочешь получить. Одно дело проявить самый младший бит числа - это то, что ты привел, а другое дело узнать каким по счету будет младший значащий бит( это то, что ты хочешь? ) :

: l?bit 1 AND -1 INVERT ;

: ?bit ( n --> c )
0 BEGIN OVER l?bit WHILE
1+ SWAP 2/ SWAP
REPEAT NIP ;
но это просто в цикле ищем. А насчет того, можно ли это получить математически нужно подумать.

WeTrust писал(а):
как для числа 8 интерпретировать ответ 8 ?

Повторюсь, ты не то хочешь - ты хочешь найти номер бита начиная с правого края, а алгоритм приводишь, предназначенный для нахождения самого младшего значащего бита! А этот алгоритм для чисел состоящих из одной двоичной единицы с кучей нулей всегда будет выдвать это самое число :)

WeTrust писал(а):
В некоторых системах пишут и о примитиве 2-.Но что-то пробовал...решил остановиться на раздельном написании.

ноги ростут от систем с использованием косвенного и прямого шитого кода, если у тебя такая система - то быстрее и короче получится если присать слитно, а для подпрограммного шитого кода может оказаться, что разницы нет никакой.

Ты исследуешь СмАл32?
Сообщение Добавлено: Вс июл 23, 2006 05:27
  Заголовок сообщения:   Ответить с цитатой
Все...вроде понял...Мдя...
Для 8 последняя значимая 1
четвертая,а поэтому это число 8
:shock:
Без бутылки не разберешься..
Думалось что слово
Цитата:
выделяющее в двоичном
разложении числа младшую единицу.
должно возвращать в стэке номер бита
в котором она находится...
Вот это обдумывал.И такое решение искал.
Сообщение Добавлено: Вс июл 23, 2006 05:13
  Заголовок сообщения:   Ответить с цитатой
oleg
Вы привели пример четного 12.
А я говорил для 4 и 8.
И последний значащий бит для
12 все таки будет 03,если для
нечетного они говорят 01.
(т.е вводят нумерацию с единицы).Да это число 4,но
как для числа 8 интерпретировать ответ 8 :shock: ?

Цитата:
: ?1bit ( n --> ) 1 AND ;
И все.
Или флаг надо получить?:

: bit>flag ( n --> flag ) 1 AND 1- invert ;


Спасибо.Буду изучать.

Цитата:
Между 1 и - не обязательно ставить пробел - есть такой приметив 1- .

В некоторых системах пишут и о примитиве 2-.Но что-то пробовал...решил остановиться на раздельном написании.
Сообщение Добавлено: Вс июл 23, 2006 04:55
  Заголовок сообщения:   Ответить с цитатой
WeTrust писал(а):
"Интересно слово LAST1 (последний бит),выделяющее в двоичном
разложении числа младшую единицу.
: LAST1 DUP DUP 1 - XOR AND ;
Однако...Корректно работая
для нечетных чисел (в силу того что там всегда 1 последняя)
дает неверный результат для 4 , 8 ...

Брр. Ничего не понял 8(
Просто выделить определенный бит? так:

: ?1bit ( n --> ) 1 AND ;
И все.
Или флаг надо получить?:

: bit>flag ( n --> flag ) 1 AND 1- invert ;

Между 1 и - не обязательно ставить пробел - есть такой приметив 1- .

Все. Доехало 8) Нужно найти младший значащий бит.
Но тогда все должно работать:

0101
DUP .s
0101 0101
DUP .s
0101 0101 0101
1- .s
0101 0101 0100
XOR .s
0101 0001
AND .
0001

то же для четных чисел:
1100
DUP .s
1100 1100
DUP .s
1100 1100 1100
1- .s
1100 1100 1011
XOR .s
1100 0111
AND .
0100

Все правильно!?
Сообщение Добавлено: Вс июл 23, 2006 04:22

Часовой пояс: UTC + 3 часа [ Летнее время ]


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
phpBB сборка от FladeX // Русская поддержка phpBB