Редактирование: CREATE

Перейти к навигации Перейти к поиску
Внимание: Вы не вошли в систему. Ваш IP-адрес будет общедоступен, если вы запишете какие-либо изменения. Если вы войдёте или создадите учётную запись, её имя будет использоваться вместо IP-адреса, наряду с другими преимуществами.

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

Текущая версия Ваш текст
Строка 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&gt;]] — в большинстве случаев при переносе такого определения слова на Каллисто достаточно просто заменить слово CREATE на [[⟨BUILDS|слово &lt;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                                      239
    A defining word used in the form:
          CREATE  <name>
    to  create a dictionary entry for <name>,  without  allocating
    any  parameter  field memory.  When  <name>  is  subsequently
    executed,  the address of the first byte of <name>'s parameter
    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: Строка 49:
{{заготовка}}
{{заготовка}}
[[Категория:Слова Каллисто]]
[[Категория:Слова Каллисто]]
[[Категория:Слова высокого уровня]]
[[Категория:Порождающие слова Каллисто]]
[[Категория:Стандартные слова]]
[[Категория:1994 CORE]]
[[Категория:2012 CORE]]
Пожалуйста, учтите, что любой ваш вклад в проект «ПМК вики» может быть отредактирован или удалён другими участниками. Если вы не хотите, чтобы кто-либо изменял ваши тексты, не помещайте их сюда.
Вы также подтверждаете, что являетесь автором вносимых дополнений, или скопировали их из источника, допускающего свободное распространение и изменение своего содержимого (см. Pmkwiki:Авторские права). НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ МАТЕРИАЛЫ!

В целях защиты вики от автоматического спама в правках просим вас решить следующую каптчу:

Отменить Справка по редактированию (в новом окне)