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

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

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

Текущая версия Ваш текст
Строка 1: Строка 1:
'''ACCEPT''' (принять) — стандартное слово [[Каллисто]]. Ввод строки с клавиатуры.
'''ACCEPT''' (принять) — стандартное слово [[Каллисто]].
ACCEPT        ( a u1 −− u2 )                      Ввести с клавиатуры строку в буфер с адресом a длиной u1.
                                                    u2 −− число введённых литер.
Слово '''ACCEPT''' осуществляет такой же ввод строки, как вы вводите команды при диалоге [[Каллисто]]. Для редактирования служит [[Клавиша Сx|клавиша {{Красная клавиша|BS}}]] (удалить последний введённый символ) и комбинация клавиш [[Клавиша F|{{Оранжевая клавиша|F}}]] [[Клавиша Сx|{{Красная клавиша|BS}}]] (удалить все введённые символы).
 
Ввод завершается [[Клавиша Ввод|клавишей {{Синяя клавиша|Ввод}}]]. Курсор уберётся с индикатора, оставшись сразу после последнего введённого символа. При этом введённая строка располагается в памяти, начиная с [[Единое адресное пространство|адреса]] a. В [[Стек данных|стек]] заносится u2 — число реально введённых символов. Слово '''ACCEPT''' не позволит ввести больше символов, чем u1.


== Ввод слова ACCEPT ==
== Ввод слова ACCEPT ==
В [[Режим ЛАТ|режиме ЛАТ]] последовательно нажмите клавиши {{ШГ←}} [[Клавиша С/П|{{Чёрная клавиша|С/П}}]] [[Клавиша С/П|{{Чёрная клавиша|С/П}}]] [[Клавиша ИП|{{Чёрная клавиша|ИП}}]] [[Клавиша 6|{{Серая клавиша|6}}]] [[Клавиша 2|{{Серая клавиша|2}}]]
В [[Режим ЛАТ|режиме ЛАТ]] последовательно нажмите клавиши [[Клавиша ШГ влево|{{Чёрная клавиша|ШГ←}}]] [[Клавиша С/П|{{Чёрная клавиша|С/П}}]] [[Клавиша С/П|{{Чёрная клавиша|С/П}}]] [[Клавиша ИП|{{Чёрная клавиша|ИП}}]] [[Клавиша 6|{{Серая клавиша|6}}]] [[Клавиша 2|{{Серая клавиша|2}}]]


== ACCEPT в стандарте ANS Forth ==
== ACCEPT в стандарте ANS Forth ==
<PRE>
  6.1.0695  ACCEPT                                                          CORE
  6.1.0695  ACCEPT                                                          CORE
             ( c-addr +n1 -- +n2 )
             ( c-addr +n1 -- +n2 )
Строка 82: Строка 76:
  курсор остался немедленно после введенного текста после получения признака  
  курсор остался немедленно после введенного текста после получения признака  
  конца строки.
  конца строки.
</PRE>
== История ==
Слово EXPECT появилось в Форте в 1965 году, когда Чак Мур подрабатывал наёмным программистом в городе Нью-Йорк. Тогда появились миникомпьютеры, а с ними и терминалы. Интерпретатор был идеален для ввода с телетайпа.
В то время EXPECT был циклом, вызывающим [[KEY]] для чтения нажатий на клавиши.
В 1994 году стандарт ANS рекомендовал использовать улучшенное слово ACCEPT вместо устаревшего слова EXPECT


Это новое слово ACCEPT и вошло в первую версию [[Каллисто]].
== Реализация EXPECT ==
 
== Реализация ==
<pre>
1210 ;#ACCEPT
1211 ; ACCEPT          ( a c1 −− c2 )                      Ввести с клавиатуры строку в буфер с адресом a длиной c1. c2 −− число введённых литер.
1212 ; В конце два нуля не добавляются, теперь это обязанность вызывающей стороны.
1213 LACCE:          .DB    6
1214                .TEXT  "ACCEPT"                ; ( a n1 −− n2 )
1215                .DW    LINKEY
1216 ACCE:          .DW    JACCE
1217 JACCE:          RM3 MA 1 + MB M3
1218                KRMB 4 F10^X − MB              ; RB − адрес, куда записываются литеры
1219                KRMA M7                        ; R7 − максимальное количество литер
1220                PPRM rrSCRLN                    ; Заранее подготовить данные для прокрутки
1221                8 ∗ M4                          ; R4 − на сколько линий корректируем y при прокрутке
1222                RM2 M1                          ; R1 − буфер в стеке возвратов, хранящий "откат"
1223 ACCST:          CX M0                          ; R0 − количество введённых литер
1224 EXPE0:          PGSB CHGET
1225                MA 8 −  FX=0 EXPE1              ; Введён код BS?
1226                RM0  FX!=0 EXPE0                ; Если ничего не введено, игнорировать
1227                1 − M0  PGSB ACCBS              ; Удалить последнюю литеру
1228 JEXPE0:        GOTO EXPE0
1229 EXPE1:          5 −  FX=0 EXPE2                ; ENTER?
1230                RM0 PKM03  KGOTO9              ; Возвратить длину строки
1231 EXPE2:          114 −  FX=0 ACCECH              ; F CX?
1232                RM0  FX!=0 EXPE0                ; Если ничего не введено, игнорировать
1233 ACCLP:          PGSB ACCBS
1234                FL0 ACCLP
1235                GOTO ACCST
1236 ACCECH:
1237                RM0 RM7 −  FX<0 EXPE0          ; Введены все литеры?
1238                RM0 1 + M0                      ; Увеличить счётчик литер
1239                RMA KMB RMB 1 + MB              ; Добавить литеру к строке
1240                PPRM9000                        ; Взять координаты курсора
1241                129 PPRM rrCHW −                ; Предельная координата по горизонтали
1242                −  FX>=0 EXPE3                  ; В конце экранной строки?
1243                <−> PPRM rrCHH +                ; Увеличить на высоту данного шрифта
1244                65 FANS − −  FX<0 EXPE4        ; На последней строке?
1245                FANS + 0 PPM9000                ; Просто опуститься на строчку вниз, в начало
1246                GOTO EXPE3
1247 EXPE4:          PGSB CHPUTCR                    ; Курсор в начало строки
1248                PGSB CHPUTSCROLL                ; Прокрутка экрана нужным цветом на нужное число строк
1249                RM1                            ; Начало буфера откатов
1250 EXPE5:          M8 RM2 −  FX<0 EXPE3            ; Всё скорректировали?
1251                KRM8 RM4 − 0 KMAX KM8          ; y −= 8 ∗ кол−во линий прокрутки или 0
1252                RM8 3 +  GOTO EXPE5
1253 EXPE3:                                          ; Вывод обычной литеры на экран
1254                RM1 3 − M1 1 − M5              ; Новый элемент в буфере откатов
1255                PPRM9000 <−> KM5 FANS KM5      ; Записать Y, X; X в RX1
1256                RMA PPM9020                    ; Вывести литеру на индикатор
1257                PPRM9000 FANS − KM5            ; Записать dX
1258                PGOTO EXPE0
1259 ACCBS:                                          ; Клавиша Cx, сделать "пробел назад" (BS)
1260                RMB 1 − MB                      ; Укоротить введённую строку
1261                RM1 3 + M1 4 − M5              ; Укоротить буфер откатов на 3 байта
1262                KRM5 KRM5 PPM9000              ; Считать y, x; Установить курсор на предыдущую литеру
1263                4 PPRM9001 KXOR                ; Сохранить атрибуты вывода в RX1
1264                PPM9001                        ; Установить атрибут 4 для DARK и 0 для LIGHT
1265                PPRM rrCHH KRM5 PPM9013        ; Шрифтовой dy; Считать dX; Вывод прямоугольника (dX может быть равен нулю)
1266                FANS PPM9001                    ; Восстановить атрибуты вывода из X1
1267                RTN
</pre>
Реализация из SP-Forth 4.20:
<pre>
VECT ACCEPT
 
: ACCEPT1 ( c-addr +n1 -- +n2 ) \ 94
\ Ввести строку максимальной длины до +n1 символов.
\ Исключительная ситуация возникает, если +n1 0 или больше 32767.
\ Отображать символы по мере ввода.
\ Ввод прерывается, когда получен символ "конец строки".
\ Ничего не добавляется в строку.
\ +n2 - длина строки, записанной по адресу c-addr.
  OVER SWAP
  H-STDIN READ-LINE
 
  DUP 109 = IF DROP -1002 THEN THROW ( ~ruv)
  0= IF -1002 THROW THEN ( ~ac)
 
  TUCK TO-LOG
  EOLN TO-LOG \ Если ввод с user-device записать cr в лог, то есть нажали Enter
;
 
' ACCEPT1 ' ACCEPT TC-VECT!
</pre>
 
=== Советская реализация EXPECT ===
Юрий Семёнов приводит следующее описание слова EXPECT через цикл DO (стр. 65-66):
Юрий Семёнов приводит следующее описание слова EXPECT через цикл DO (стр. 65-66):
   : EXPECT          ( в стеке адрес ввода и максимальное число
   : EXPECT          ( в стеке адрес ввода и максимальное число
Строка 193: Строка 92:
           2 ERASE ;    ( запись нулей в два последних байта)
           2 ERASE ;    ( запись нулей в два последних байта)


Определение слова EXPECT в ядре ФОРТ-ЕС использует примитив (EXPECT)
== История ==
 
Слово EXPECT появилось в Форте в 1965 году, когда Чак Мур подрабатывал наёмным программистом в городе Нью-Йорк. Тогда появились миникомпьютеры, а с ними и терминалы. Интерпретатор был идеален для ввода с телетайпа.
Вот их опубликованные описания и определения:
<PRE>
  (EXPECT)  * А,+N1->А,+N2                            ВВЕСТИ С ТЕРМИНАЛА  6
                              +N1 ЛИТЕР ПО АДРЕСУ А ДО ПЕРЕВОДА СТРОКИ;
                                +N2 - ФАКТИЧЕСКОЕ ЧИСЛО ВВЕДЕННЫХ ЛИТЕР
 
EXPECT    A,+N-> ВВЕСТИ С ТЕРМИНАЛА +N ЛИТЕР ПО                40
          АДРЕСУ A,В ПЕРЕМЕННУЯ "SPAN" ЗАСЛАТЬ
          ФАКТИЧЕСКОЕ ЧИСЛО ВВЕДЕННЫХ ЛИТЕР)
          ЛИТЕРЫ НАПЕЧАТАТЬ НИ ТЕРМИНАЛЕ
 
                    Экран номер 6
( 09.09.86 KEY CR EMIT TYPE (EXPECT/ RBLK MBLK )
(  следующие определения дают только имена процедур)
 
CODE (EXPECT) ( A,N1->A,N2  ВВЕСТИ С ТЕРМИНАЛА НЕ БОЛЕЕ
  N1 ЛИТЕР /ДО ПЕРЕВОДА СТРОКИ/ В БУФЕР ПО АДРЕСУ А;
  N2 - ФАКТИЧЕСКОЕ  ЧИСЛО ВВЕДЕННЫХ  ЛИТЕР)  END-CODE
 
                    Экран номер 40
( 31.03.84      EXPECT  OUERY INTERPRET  ФОРТ-СИСТЕМА  X )
 
: EXPECT  ( A,+N->)  DUP >R (EXPECT) DUP SPAN !
  TYPE R> SPAN @ - IF SPACE THEN ;
</PRE>
 
В FORTH ИТЭФ слово EXPECT также было [[примитив]]ом, обёрткой вокруг соответствующей функции DOS. Вот его определение:
<PRE>


            HEAD    206Q,'EXPEC',324Q,EXPE              ; EXPECT
EXPECT был циклом, вызывающим [[KEY]] для чтения нажатий на клавиши.
            MOV  AH, 0AH
            POP  CX                  ; Число символов
            POP  BX                  ; Адрес буфера SS
            MOV  BYTE PTR [BX],  CL  ; Засылка ожидаемого числа
            MOV  DX, BX
            INT  21H


            MOV  AL, BYTE PTR [BX+1]
В 1994 году стандарт ANS рекомендовал использовать новое слово ACCEPT вместо старого слова EXPECT
            SUB  AH, AH
            ADD  BX, AX
            MOV  WORD PTR [BX+2],0
            NEXT
</PRE>


== Ссылки ==
== Ссылки ==
* {{Исходник|ACCEPT|ACCEPT}}
* См. слова [[KEY]], [[TIB]], [[QUERY]] и [[Слово TYPE|TYPE]]
* См. также слово EXPECT в главе [http://gudleifr.h1.ru/cgi-bin/pilo.cgi?FL=../g9.txt&IS=\6.PERWOISTOTNIKI\LEO%20BRODIE%20STARTING%20FORTH\10.WWOD-WYWOD «Вввод-вывод»] книги [http://gudleifr.h1.ru/cgi-bin/pilo.cgi?FL=../g9.txt&IS=\6.PERWOISTOTNIKI\LEO%20BRODIE%20STARTING%20FORTH Л.Броуди «Начальный курс программирования на языке Форт»]
* См. также слово ACCEPT в главе [http://www.forth.com/starting-forth/sf10/sf10.html I/O and You] книги [http://www.forth.com/starting-forth/ Leo Brodie Starting Forth] ''(англ.)''
* Слово [http://forth.sourceforge.net/standard/dpans/dpans6.htm#6.1.0695 ACCEPT] и [http://forth.sourceforge.net/standard/dpans/dpansa6.htm#A.6.1.0695 комментарий к нему] в стандарте ANS Forth ''(англ.)''
* Слово [http://forth.sourceforge.net/standard/dpans/dpans6.htm#6.1.0695 ACCEPT] и [http://forth.sourceforge.net/standard/dpans/dpansa6.htm#A.6.1.0695 комментарий к нему] в стандарте ANS Forth ''(англ.)''
* Слово [http://forth-standard.org/standard/core/ACCEPT ACCEPT] и [http://forth-standard.org/standard/rationale#rat:core:ACCEPT комментарий к нему] в черновике Forth 200x ''(англ.)''
* Слово [http://www.forth200x.org/documents/html3/core/ACCEPT.html ACCEPT] и [http://www.forth200x.org/documents/html3/rationale.html#rat:core:ACCEPT комментарий к нему] в черновике Forth 200x ''(англ.)''




Строка 253: Строка 109:
[[Категория:Примитивы]]
[[Категория:Примитивы]]
[[Категория:Терминальный ввод/вывод Каллисто]]
[[Категория:Терминальный ввод/вывод Каллисто]]
[[Категория:Стандартные слова]]
[[Категория:Слова Каллисто без стековых диаграмм]]
[[Категория:1994 CORE]]
[[Категория:2012 CORE]]
Пожалуйста, учтите, что любой ваш вклад в проект «ПМК вики» может быть отредактирован или удалён другими участниками. Если вы не хотите, чтобы кто-либо изменял ваши тексты, не помещайте их сюда.
Вы также подтверждаете, что являетесь автором вносимых дополнений, или скопировали их из источника, допускающего свободное распространение и изменение своего содержимого (см. Pmkwiki:Авторские права). НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ МАТЕРИАЛЫ!

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

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