Текущая версия |
Ваш текст |
Строка 1: |
Строка 1: |
| '''CREATE''' (создать) — стандартное слово [[Каллисто]]. | | '''CREATE''' — стандартное слово [[Каллисто]]. |
| CREATE ( −− ) Создать начало статьи (до PFA) для следующего слова.
| | |
| Фраза CREATE XXX формирует слово с именем XXX (заголовок и [[CFA]]), оставляя его [[поле параметров]] пустым. При исполнении такое слово кладёт на [[Стек данных|стек]] [[PFA|адрес своего поля данных]].
| | Формирует слово с именем XXX (заголовок и [[CFA]]), оставляя его поле параметров пустым. |
|
| |
|
| == Ввод слова CREATE ==
| |
| В [[Режим ЛАТ|режиме ЛАТ]] последовательно нажмите клавиши [[Клавиша С/П|{{Чёрная клавиша|С/П}}]] [[Клавиша ×|{{Серая клавиша|×}}]] [[Клавиша ИП|{{Чёрная клавиша|ИП}}]] {{ШГ←}} [[Клавиша 2|{{Серая клавиша|2}}]] [[Клавиша ИП|{{Чёрная клавиша|ИП}}]]
| |
|
| |
|
| == CREATE в стандарте ANS Forth == | | == CREATE в стандарте ANS Forth == |
| <pre>
| |
| 6.1.1000 CREATE CORE | | 6.1.1000 CREATE CORE |
| ( "<spaces>name" -- ) | | ( "<spaces>name" -- ) |
Строка 30: |
Строка 27: |
| Типичное использование: | | Типичное использование: |
| ... CREATE SOMETHING ... | | ... CREATE SOMETHING ... |
| </pre>
| |
|
| |
| == История ==
| |
| Слово присутствует в Форте−79 и последующих, но имеет небольшие отличия из−за принятия на себя функций <BUILDS
| |
|
| |
| В 1968 году Чак Мур работал в Mohasco Industries, Inc ([https://en.wikipedia.org/wiki/Amsterdam_%28city%29,_New_York Amsterdam NY], ''англ.''). Первая версия интерпретатора, получившая название FORTH, заработала на миникомпьютере IBM 1130 с графическим дисплеем 2250 (16-битный процессор с ОЗУ 8К, дисководом, клавиатурой, принтером и ридером/панчером перфокарт). Первый FORTH знал слово CREATE под именем ENTER
| |
|
| |
| CREATE создавал классическую [[Словарная статья|словарную статью]]:
| |
| ссылка на предыдущую запись
| |
| счётчик и 3 символа
| |
| код для выполнения
| |
| параметры
| |
|
| |
|
| [[Поле кода]] было важной инновацией, так как косвенный переход был единственным накладным расходом, как только слово было найдено. Про ценность счётчика для различения слов Чак Мур узнал от писателей компиляторов из Стэнфорда.
| |
|
| |
|
| В 1970 году Чак Мур, создатель Форта, называл слова, кладущие на стек значение или адрес своего [[поле данных|поля данных]] «существительными» (''англ.'' noun).
| | == CREATE в предыдущем стандарте Forth-83 (англ.) == |
| | |
| Если CREATE используется, как часть современной конструкции CREATE…[[DOES⟩|DOES>]] — в большинстве случаев при переносе такого определения слова на Каллисто достаточно просто заменить слово CREATE на [[⟨BUILDS|слово <BUILDS]]
| |
| | |
| Английское слово [http://www.lingvo-online.ru/ru/Translate/en-ru/create create] означает «создать».
| |
| | |
| === CREATE в предыдущем стандарте Forth-83 (англ.) ===
| |
| CREATE -- M,79 | | CREATE -- M,79 |
| A defining word executed in the form: | | A defining word executed in the form: |
Строка 62: |
Строка 40: |
| not allocate space in <name>'s parameter field. | | not allocate space in <name>'s parameter field. |
|
| |
|
| === CREATE в стандарте Forth-79 (англ.) ===
| | |
| | == CREATE в стандарте Forth-79 (англ.) == |
| CREATE 239 | | CREATE 239 |
| A defining word used in the form: | | A defining word used in the form: |
Строка 71: |
Строка 50: |
| field is left on the stack. | | field is left on the stack. |
|
| |
|
| === CREATE в fig-FORTH Release 1 glossary, май 1979 (англ.) ===
| |
| CREATE
| |
| A defining word used in the form:
| |
| CREATE cccc
| |
| by such words as CODE and CONSTANT to create a dictionary header for
| |
| a Forth definition. The code field contains the address of the words
| |
| parameter field. The new word is created in the CURRENT vocabulary.
| |
|
| |
| == Реализация ==
| |
| Создающая часть слова CREATE является высокоуровневой. Для ускорения исполнения создаваемых слов исполняющая часть слова CREATE написана на [[ЯМК|языке МК]].
| |
| <pre>
| |
| 3310 ;#CREATE
| |
| 3311 ; CREATE ( −− ) Создать начало статьи (до PFA) для следующего слова.
| |
| 3312 ; Сформировать слово с именем XXX (заголовок и CFA), оставив его поле параметров пустым.
| |
| 3313 ; При обращении к XXX на стек кладётся его адрес.
| |
| 3314 ; Длина имени слова ограничивается 31 литерой
| |
| 3315 ; Слово присутствует в Форте−79 и последующих, но имеет небольшие отличия из−за принятия на себя функций <BUILDS
| |
| 3316 LCREAT: .DB 6
| |
| 3317 .TEXT "CREATE" ; ( "<пр>имя" −− )
| |
| 3318 .DW LIDDOT
| |
| 3319 CREAT: .DW CALL, BL,WORD, FIND, ZBRAN,CRE
| |
| 3320 .DW DROP,IDDOT,LITB ; Наш FIND возвращает NFA
| |
| 3321 .DB 4
| |
| 3322 .DW MESS ; Сообщение, что такое слово уже есть
| |
| 3323 CRE: .DW HERE, DUP,CAT, LITB
| |
| 3324 .DB 31
| |
| 3325 .DW MIN ; Обрезать длину по 31 литеру
| |
| 3326 .DW DUP, CCOM ; биты SMUDGE и IMMEDIATE сброшены
| |
| 3327 .DW ALLOT ; Оставить слово как поле имени
| |
| 3328 .DW LATES, COMMA ; NFA прошлого слова в поле связи
| |
| 3329 .DW CURR,UAT, STORE ; Сделать слово последним в словаре CURRENT @
| |
| 3330 .DW LITP,SCRE, BRAN,RCOMMA ; CFA: созданное слово кладёт на стек свой PFA
| |
| 3331 SCRE: RM7 10002 + KM3 KGOTO9 ; Созданные слова размещаются в области двоичных данных
| |
| </pre>
| |
| Реализации из SP-Forth 4.20:
| |
| <pre>
| |
| 0 VALUE CREATE-CODE
| |
| …
| |
| CODE _CREATE-CODE
| |
| LEA EBP, -4 [EBP]
| |
| MOV [EBP], EAX
| |
| POP EAX
| |
| RET
| |
| END-CODE
| |
|
| |
| ' _CREATE-CODE TO CREATE-CODE
| |
| …
| |
| ' _CREATE-CODE >VIRT VALUE CREATE-CODE
| |
| …
| |
| : SHEADER ( addr u -- )
| |
| HERE 0 , ( cfa )
| |
| \ DUP LAST-CFA !
| |
| 0 C, ( flags )
| |
| -ROT WARNING @
| |
| IF 2DUP GET-CURRENT SEARCH-WORDLIST
| |
| IF DROP 2DUP TYPE ." isn't unique" CR THEN
| |
| THEN
| |
| CURRENT @ +SWORD
| |
| ALIGN
| |
| HERE SWAP ! ( заполнили cfa )
| |
| ;
| |
|
| |
| : HEADER
| |
| PARSE-NAME SHEADER
| |
| ;
| |
| …
| |
| : CREATE ( "<spaces>name" -- ) \ 94
| |
| [T] HEADER [I]
| |
| CREATE-CODE COMPILE,
| |
| ;
| |
| </pre>
| |
| <pre>
| |
| USER LAST-CFA
| |
| …
| |
| VECT SHEADER
| |
|
| |
| : SHEADER1 ( addr u -- )
| |
| HERE 0 , ( cfa )
| |
| DUP LAST-CFA !
| |
| 0 C, ( flags )
| |
| -ROT WARNING @
| |
| IF 2DUP GET-CURRENT SEARCH-WORDLIST
| |
| IF DROP 2DUP TYPE ." isn't unique (" SOURCE-NAME TYPE ." )" CR THEN
| |
| THEN
| |
| CURRENT @ +SWORD
| |
|
| |
| ALIGN
| |
| ( сдвигаем указатель кода так, чтобы при компиляции переменных и векторов )
| |
| ( следующая ячейка данных, находящаяся после CALL *-CODE была выровнена: )
| |
| ALIGN-BYTES @ DUP 4 >
| |
| IF 5 - ALLOT
| |
| ELSE 1 - ALLOT
| |
| THEN
| |
|
| |
| HERE SWAP ! ( заполнили cfa )
| |
| ;
| |
| ' SHEADER1 ' SHEADER TC-VECT!
| |
| …
| |
| : CREATED ( addr u -- )
| |
| \ Создать определение для c-addr u с семантикой выполнения, описанной ниже.
| |
| \ Если указатель пространства данных не выровнен, зарезервировать место
| |
| \ для выравнивания. Новый указатель пространства данных определяет
| |
| \ поле данных name. CREATE не резервирует место в поле данных name.
| |
| \ name Выполнение: ( -- a-addr )
| |
| \ a-addr - адрес поля данных name. Семантика выполнения name может
| |
| \ быть расширена с помощью DOES>.
| |
| SHEADER
| |
|
| |
| HERE DUP LAST-CFA @ !
| |
| DOES>A ! ( для DOES )
| |
| ['] _CREATE-CODE COMPILE,
| |
| ;
| |
|
| |
| : CREATE ( "<spaces>name" -- ) \ 94
| |
| PARSE-NAME CREATED
| |
| ;
| |
| </pre>
| |
|
| |
| === Советская реализация ===
| |
| Юрий Семёнов приводит следующее определение слова CREATE (стр. 139):
| |
| <PRE>
| |
| : CREATE FINDN ( поиск слова в словаре)
| |
| IF ( если оно найдено)
| |
| DROP ( запись адреса поля имени в стек)
| |
| ID. ( печать имени)
| |
| 4 MESSAGE ( печать "MSG# 4")
| |
| THEN HERE ↑ C@ ( запись в стек числа символов
| |
| в слове)
| |
| WIDTH @ ( максимально допустимое число символов в
| |
| имени )
| |
| MIN ( укорочение имени, если оно слишком
| |
| длинное)
| |
| 1+ ALLOT ( выделение нужного числа байт)
| |
| ?ALIGN ( выравнивание выделенного числа байт на
| |
| чётную границу, что важно для ЭВМ типа
| |
| СМ)
| |
| ↑ $A0 TOGGLE ( коррекция байта имени)
| |
| HERE 1- $80 TOGGLE ( коррекция последнего байта
| |
| имени)
| |
| LAST , ( формирование поля LFA)
| |
| CURRENT @ ! ( коррекция значения CURRENT)
| |
| HERE 2+ , ; ( заполнение поля CFA)
| |
| </PRE>
| |
| Описание и определение слова CREATE в ядре ФОРТ-ЕС:
| |
| <PRE>
| |
| CREATE -> СОЗДАТЬ НАЧАЛО СТАТЬИ (ДО PFA) ДЛЯ 36
| |
| СЛЕДУЮЩЕГО СЛОВА)
| |
| ЕГО ИСПОЛНЕНИЕ КЛАДЕТ PFA НА СТЕК
| |
| CREATE# A НАЧАЛО ИСПОЛНИТЕЛЬНОЙ ЧАСТИ "VARIABLE" 3
| |
|
| |
| Экран номер 3
| |
| ( 09.09.86 ДОПОЛНИТЕЛЬНЫЕ ВХОДЫ В АДРЕСНЫЙ ИНТЕРПРЕТАТОР)
| |
|
| |
| A: CREATE# RW1 14 LR, ( ПОМЕСТИТЬ РFA СТАТЬИ)
| |
| M: PUSHRW1 RSTACK RTWO SR, ( ПОМЕСТИТЬ ЗНАЧЕНИЕ ИЗ RW1)
| |
| M: PUTRW1 RW1 PUT, RNEXT BR, ( ЗАМЕНИТЬ ВЕРХНЕЕ)
| |
|
| |
| Экран номер 36
| |
| ( 09.09.86 CREATE DOES> )
| |
|
| |
| : CREATE ( ->) 100 ?GAP
| |
| ALIGNH -FIND SWAP DROP IF
| |
| HERE ID. ." УЖЕ ЕСТЬ " THEN
| |
| HERE DUP С@ WIDTH AND 2+ ALLOT ALIGNH
| |
| HERE OVER - 2- OVER C! LATEST , CURRENT @ !
| |
| LIT [ CREATE# ] , ;
| |
| </PRE>
| |
| Определение слова CREATE в FORTH ИТЭФ:
| |
| <PRE>
| |
| HEAD 206Q,'CREAT',305Q,GREAT,$COL ; CREATE
| |
| DW DFIND,ZBRAN,CRE-$,DROP,TWOP,NFA,IDDOT
| |
| DW LIT,4,MESS
| |
| CRE: DW HERE,DUBL,CAT,$WIDTH,AT,MIN,ONEP,ALLOT
| |
| DW DUBL,LIT,240Q,TOGL,HERE,ONEM
| |
| DW LIT,200Q,TOGL,LATES,COMMA,CURR,AT,STORE
| |
| DW HERE,TWOP,COMMA,SEMI
| |
| </PRE>
| |
|
| |
|
| == Ссылки == | | == Ссылки == |
| * {{Исходник|CREATE|CREATE}} | | * [http://forth.sourceforge.net/standard/dpans/dpans6.htm#6.1.1000 Слово CREATE в стандарте ANS Forth] ''(англ.)'' и [http://forth.sourceforge.net/standard/dpans/dpansa6.htm#A.6.1.1000 комментарий к нему] ''(англ.)'' |
| * Слово [http://forth.sourceforge.net/standard/dpans/dpans6.htm#6.1.1000 CREATE] и [http://forth.sourceforge.net/standard/dpans/dpansa6.htm#A.6.1.1000 комментарий к нему] в стандарте ANS Forth ''(англ.)''
| | * [http://www.forth200x.org/documents/html/core.html#core:CREATE Слово CREATE в черновике Forth 200x] ''(англ.)'' и [http://www.forth200x.org/documents/html/rationale.html#rat:core:CREATE комментарий к нему] ''(англ.)'' |
| * Слово [http://forth-standard.org/standard/core/CREATE CREATE] и [http://forth-standard.org/standard/rationale#rat:core:CREATE комментарий к нему] в черновике Forth 200x ''(англ.)'' | |
| * [http://gudleifr.h1.ru/cgi-bin/pilo.cgi?FL=../g9.txt&IS=\6.PERWOISTOTNIKI\LEO%20BRODIE%20STARTING%20FORTH\08.PEREMENNYE,%20KONSTANTY%20I%20MASSIWY ПЕРЕМЕННЫЕ, КОНСТАНТЫ И МАССИВЫ] в книге [http://gudleifr.h1.ru/cgi-bin/pilo.cgi?FL=../g9.txt&IS=\6.PERWOISTOTNIKI\LEO%20BRODIE%20STARTING%20FORTH Л.Броуди «Начальный курс программирования на языке Форт»]
| |
| * [http://www.forth.com/starting-forth/sf8/sf8.html Variables, Constants, and Arrays] в книге [http://www.forth.com/starting-forth/ Leo Brodie Starting Forth] ''(англ.)''
| |
|
| |
|
|
| |
|
Строка 260: |
Строка 59: |
| {{заготовка}} | | {{заготовка}} |
| [[Категория:Слова Каллисто]] | | [[Категория:Слова Каллисто]] |
| [[Категория:Слова высокого уровня]]
| |
| [[Категория:Порождающие слова Каллисто]]
| |
| [[Категория:Стандартные слова]]
| |
| [[Категория:1994 CORE]]
| |
| [[Категория:2012 CORE]]
| |