BEGIN: различия между версиями
AtH (обсуждение | вклад) |
AtH (обсуждение | вклад) |
||
(не показано 18 промежуточных версий этого же участника) | |||
Строка 1: | Строка 1: | ||
'''BEGIN''' (начать, начало) — стандартное слово [[Каллисто]]. | '''BEGIN''' (начать, начало) — стандартное слово [[Каллисто]]. Начать цикл. | ||
BEGIN ( −− ) Отметить начало циклов BEGIN. | BEGIN ( −− ) Отметить начало циклов BEGIN. | ||
Два цикла с условием — [[Цикл BEGIN-WHILE-REPEAT|BEGIN…WHILE…REPEAT]] и [[Цикл BEGIN-UNTIL|BEGIN…UNTIL]] — а также «бесконечный» цикл BEGIN…[[AGAIN]] начинаются со слова BEGIN: | |||
BEGIN условие WHILE тело-цикла REPEAT | |||
BEGIN тело-цикла условие UNTIL | |||
BEGIN тело-цикла AGAIN | |||
Слово BEGIN отмечает начало цикла. При компиляции его главное назначение — запись в [[Стек данных|стек]] текущего значения указателя [[HERE]], которое используют слова [[UNTIL]], [[REPEAT]] или [[AGAIN]], чтобы сформировать правильный адрес ветвления на начало цикла. | |||
== Ввод слова BEGIN == | == Ввод слова BEGIN == | ||
В [[Режим ЛАТ|режиме ЛАТ]] последовательно нажмите клавиши [[Клавиша В/О|{{Чёрная клавиша|В/О}}]] [[Клавиша ИП|{{Чёрная клавиша|ИП}}]] [[Клавиша БП|{{Чёрная клавиша|БП}}]] [[Клавиша 7|{{Серая клавиша|7}}]] [[Клавиша 4|{{Серая клавиша|4}}]] | В [[Режим ЛАТ|режиме ЛАТ]] последовательно нажмите клавиши [[Клавиша В/О|{{Чёрная клавиша|В/О}}]] [[Клавиша ИП|{{Чёрная клавиша|ИП}}]] [[Клавиша БП|{{Чёрная клавиша|БП}}]] [[Клавиша 7|{{Серая клавиша|7}}]] [[Клавиша 4|{{Серая клавиша|4}}]] | ||
== BEGIN в стандарте ANS Forth == | == BEGIN в стандарте ANS Forth == | ||
Строка 82: | Строка 80: | ||
== Реализация == | == Реализация == | ||
Слово BEGIN начинает свою работу с того, что с помощью [[?COMP]] убеждается — [[INTERPRET|текстовый интерпретатор]] находится в [[Слово ]|состоянии компиляции]]. Если нет, слово [[?COMP]] вызывает [[Авост приложения|авост]] с сообщением об ошибке №17. | |||
Само слово BEGIN ничего не компилирует в [[шитый код]]. Оно лишь [[⟨MARK|запоминает в стеке текущий адрес]], чтобы в дальнейшем скомпилировать на него [[?BRANCH|условный]] (цикл BEGIN…[[UNTIL]]) или [[BRANCH|безусловный]] (циклы BEGIN…[[AGAIN]] и [[Цикл BEGIN-WHILE-REPEAT|BEGIN…WHILE…REPEAT]]) переход. | |||
<pre> | |||
3677 ;#BEGIN | |||
3678 ; BEGIN I ( −− ) Начало циклов "BEGIN". | |||
3679 LBEGIN: .DB 85H | |||
3680 .TEXT "BEGIN" | |||
3681 .DW LAGAIN | |||
3682 BEGIN: .DW CALL, QCOMP, LMARK, ONE, EXIT | |||
</pre> | |||
Реализации из SP-Forth 4.20: | |||
<pre> | |||
: BEGIN \ 94 | |||
\ Интерпретация: семантика неопределена. | |||
\ Компиляция: ( C: -- dest ) | |||
\ Положить следующую позицию передачи управления, dest, на управляющий стек. | |||
\ Добавить семантику времени выполнения, данную ниже, к текущему определению. | |||
\ Время выполнения: ( -- ) | |||
\ Продолжить выполнение. | |||
?COMP | |||
ALIGN-BYTES @ ALIGN-NOP | |||
\ HERE TO :-SET | |||
<MARK 3 | |||
; IMMEDIATE | |||
</pre> | |||
<pre> | |||
: BEGIN POSTPONE BEGIN DP @ TO :-SET ; IMMEDIATE | |||
</pre> | |||
=== Советская реализация === | |||
Юрий Семёнов приводит следующее определение слова BEGIN (стр. 64): | Юрий Семёнов приводит следующее определение слова BEGIN (стр. 64): | ||
: BEGIN ?COMP HERE 1 ; IMMEDIATE | : BEGIN ?COMP HERE 1 ; IMMEDIATE | ||
Строка 114: | Строка 143: | ||
* {{Исходник|BEGIN|BEGIN}} | * {{Исходник|BEGIN|BEGIN}} | ||
* См. слова [[WHILE]] и [[REPEAT]], [[UNTIL]] и [[AGAIN]] | * См. слова [[WHILE]] и [[REPEAT]], [[UNTIL]] и [[AGAIN]] | ||
* См. также цикл [[FOR]]…[[NEXT]] | |||
* Слово [http://forth.sourceforge.net/standard/dpans/dpans6.htm#6.1.0760 BEGIN] и [http://forth.sourceforge.net/standard/dpans/dpansa6.htm#A.6.1.0760 комментарий к нему] в стандарте ANS Forth ''(англ.)'' | * Слово [http://forth.sourceforge.net/standard/dpans/dpans6.htm#6.1.0760 BEGIN] и [http://forth.sourceforge.net/standard/dpans/dpansa6.htm#A.6.1.0760 комментарий к нему] в стандарте ANS Forth ''(англ.)'' | ||
* Слово [http://forth-standard.org/standard/core/BEGIN BEGIN] и [http://forth-standard.org/standard/rationale#rat:core:BEGIN комментарий к нему] в черновике Forth 200x ''(англ.)'' | * Слово [http://forth-standard.org/standard/core/BEGIN BEGIN] и [http://forth-standard.org/standard/rationale#rat:core:BEGIN комментарий к нему] в черновике Forth 200x ''(англ.)'' | ||
Строка 128: | Строка 158: | ||
[[Категория:Структуры управления Каллисто]] | [[Категория:Структуры управления Каллисто]] | ||
[[Категория:Слова, способные вызывать авост приложения]] | [[Категория:Слова, способные вызывать авост приложения]] | ||
[[Категория:Компилирующие слова]] | |||
[[Категория:Стандартные слова]] | |||
[[Категория:1994 CORE]] | |||
[[Категория:2012 CORE]] |
Текущая версия от 19:23, 13 ноября 2017
BEGIN (начать, начало) — стандартное слово Каллисто. Начать цикл.
BEGIN ( −− ) Отметить начало циклов BEGIN.
Два цикла с условием — BEGIN…WHILE…REPEAT и BEGIN…UNTIL — а также «бесконечный» цикл BEGIN…AGAIN начинаются со слова BEGIN:
BEGIN условие WHILE тело-цикла REPEAT BEGIN тело-цикла условие UNTIL BEGIN тело-цикла AGAIN
Слово BEGIN отмечает начало цикла. При компиляции его главное назначение — запись в стек текущего значения указателя HERE, которое используют слова UNTIL, REPEAT или AGAIN, чтобы сформировать правильный адрес ветвления на начало цикла.
Ввод слова BEGIN[править]
В режиме ЛАТ последовательно нажмите клавиши В/О ИП БП 7 4
BEGIN в стандарте ANS Forth[править]
6.1.0760 BEGIN CORE Интерпретация: Семантика интерпретации для этого слова не определена. Компиляция: ( C: -- dest ) Помещает адрес следующей ячейки для передачи управления, dest, на стек потока-управления. Добавляет семантику времени-выполнения, данную ниже к текущему определению. Время-выполнения: ( -- ) Продолжает выполнение. См.: 3.2.3.2 Стек потока-управления, 6.1.2140 REPEAT, 6.1.2390 UNTIL, 6.1.2430 WHILE. A.6.1.0760 BEGIN Типичное использование: : X ... BEGIN ... test UNTIL ; или : X ... BEGIN ... test WHILE ... REPEAT ;
История[править]
BEGIN в предыдущем стандарте Forth-83 (англ.)[править]
BEGIN -- C,I,79 -- sys (compiling) Used in the form: BEGIN ... flag UNTIL or BEGIN ... flag WHILE ... REPEAT BEGIN marks the start of a word sequence for repetitive execution. A BEGIN-UNTIL loop will be repeated until flag is true. A BEGIN-WHILE-REPEAT will be repeated until flag is false. The words after UNTIL or REPEAT will be executed when either loop is finished. sys is balanced with its corresponding UNTIL or WHILE . See: "9.9 Control Structures"
BEGIN в стандарте Forth-79 (англ.)[править]
BEGIN I,C,147 Used in a colon-definition in the form: BEGIN ... flag UNTIL or BEGIN ... flag WHILE ... REPEAT BEGIN marks the start of a word sequence for repetitive execution. A BEGIN-UNTIL loop will be repeated until flag is true. A BEGIN-WHILE-REPEAT loop will be repeated until flag is false. The words after UNTIL or REPEAT will be executed when either loop is finished. flag is always dropped after being tested.
BEGIN в fig-FORTH Release 1 glossary, май 1979 (англ.)[править]
BEGIN --- addr n (compiling) P,L0 Occurs in a colon-definition in form: BEGIN ... UNTIL BEGIN ... AGAIN BEGIN ... WHILE ... REPEAT At run-time, BEGIN marks the start of a sequence that may be repetitively executed. It serves as a return point from the corresponding UNTIL, AGAIN or REPEAT. When executing UNTIL, a return to BEGIN will occur if the top of the stack is false; for AGAIN and REPEAT a return to BEGIN always occurs. At compile time BEGIN leaves its return address and n for compiler error checking.
Реализация[править]
Слово BEGIN начинает свою работу с того, что с помощью ?COMP убеждается — текстовый интерпретатор находится в состоянии компиляции. Если нет, слово ?COMP вызывает авост с сообщением об ошибке №17.
Само слово BEGIN ничего не компилирует в шитый код. Оно лишь запоминает в стеке текущий адрес, чтобы в дальнейшем скомпилировать на него условный (цикл BEGIN…UNTIL) или безусловный (циклы BEGIN…AGAIN и BEGIN…WHILE…REPEAT) переход.
3677 ;#BEGIN 3678 ; BEGIN I ( −− ) Начало циклов "BEGIN". 3679 LBEGIN: .DB 85H 3680 .TEXT "BEGIN" 3681 .DW LAGAIN 3682 BEGIN: .DW CALL, QCOMP, LMARK, ONE, EXIT
Реализации из SP-Forth 4.20:
: BEGIN \ 94 \ Интерпретация: семантика неопределена. \ Компиляция: ( C: -- dest ) \ Положить следующую позицию передачи управления, dest, на управляющий стек. \ Добавить семантику времени выполнения, данную ниже, к текущему определению. \ Время выполнения: ( -- ) \ Продолжить выполнение. ?COMP ALIGN-BYTES @ ALIGN-NOP \ HERE TO :-SET <MARK 3 ; IMMEDIATE
: BEGIN POSTPONE BEGIN DP @ TO :-SET ; IMMEDIATE
Советская реализация[править]
Юрий Семёнов приводит следующее определение слова BEGIN (стр. 64):
: BEGIN ?COMP HERE 1 ; IMMEDIATE
У Баранова-Ноздрунова определение слова BEGIN выглядит так (стр. 58):
: BEGIN ( ---> A,2 ) <MARK 2 ; IMMEDIATE
В 11-й главе Starting FORTH слово BEGIN определяется так:
: BEGIN HERE ; IMMEDIATE
Описание слова BEGIN и определение циклов BEGIN в ядре ФОРТ-ЕС:
BEGIN HK->А,1 /КОМПИЛЯЦИЯ/ НАЧАЛО ЦИКЛА "BEGIN" 47 -> /ИСПОЛНЕНИЕ/ Экран номер 47 ( 31.03.86 СТАНДАРТНЫЕ СТРУКТУРЫ УПРАВЛЕНИЯ ) : BEGIN ?COMP <MARK 1 ; IMMEDIATE : UNTIL 1 ?PAIRS COMPILE ?BRANCH <RESOLVE ; IMMEDIATE : AGAIN 1 ?PAIRS COMPILE BRANCH <RESOLVE ; IMMEDIATE : WHILE 1 ?PAIRS 1 [COMPILE] IF ; IMMEDIATE : REPEAT >R >R [COMPILE] AGAIN R> R> [COMPILE] THEN ; IMMEDIATE
Определение слова BEGIN в FORTH ИТЭФ:
HEAD 305Q,'BEGI',316Q,BEGIN,$COL ; BEGIN DW QCOMP,HERE,ONE,SEMI
Ссылки[править]
- Исходный текст слова BEGIN в Каллисто Классик 1.0
- См. слова WHILE и REPEAT, UNTIL и AGAIN
- См. также цикл FOR…NEXT
- Слово BEGIN и комментарий к нему в стандарте ANS Forth (англ.)
- Слово BEGIN и комментарий к нему в черновике Forth 200x (англ.)
- ЦИКЛИЧЕСКИЕ СТРУКТУРЫ в книге Л.Броуди «Начальный курс программирования на языке Форт»
- Цикл в Википедии
- Throw It For a Loop в книге Leo Brodie Starting Forth (англ.)
У этой статьи нет иллюстраций. Вы можете помочь проекту, добавив их. |
Это заготовка статьи. Вы можете помочь проекту, дополнив её. |