ACCEPT: различия между версиями

Материал из ПМК вики
Перейти к навигации Перейти к поиску
Нет описания правки
Нет описания правки
 
(не показано 13 промежуточных версий этого же участника)
Строка 1: Строка 1:
'''ACCEPT''' (принять) — стандартное слово [[Каллисто]].
'''ACCEPT''' (принять) — стандартное слово [[Каллисто]]. Ввод строки с клавиатуры.
  ACCEPT        ( a u1 −− u2 )                      Ввести с клавиатуры строку в буфер с адресом a длиной u1. u2 −− число введённых литер.
  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 )
Строка 76: Строка 82:
  курсор остался немедленно после введенного текста после получения признака  
  курсор остался немедленно после введенного текста после получения признака  
  конца строки.
  конца строки.
</PRE>


== История ==
== История ==
Строка 86: Строка 93:
Это новое слово ACCEPT и вошло в первую версию [[Каллисто]].
Это новое слово 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          ( в стеке адрес ввода и максимальное число
Строка 129: Строка 221:
</PRE>
</PRE>


В FORTH ИТЭФ слово EXPECT также было [[примитив]]ом, вот его определение:
В FORTH ИТЭФ слово EXPECT также было [[примитив]]ом, обёрткой вокруг соответствующей функции DOS. Вот его определение:
<PRE>
<PRE>


Строка 161: Строка 253:
[[Категория:Примитивы]]
[[Категория:Примитивы]]
[[Категория:Терминальный ввод/вывод Каллисто]]
[[Категория:Терминальный ввод/вывод Каллисто]]
[[Категория:Стандартные слова]]
[[Категория:1994 CORE]]
[[Категория:2012 CORE]]

Текущая версия от 13:51, 25 октября 2018

ACCEPT (принять) — стандартное слово Каллисто. Ввод строки с клавиатуры.

ACCEPT         ( a u1 −− u2 )                       Ввести с клавиатуры строку в буфер с адресом a длиной u1.
                                                    u2 −− число введённых литер.

Слово ACCEPT осуществляет такой же ввод строки, как вы вводите команды при диалоге Каллисто. Для редактирования служит клавиша  BS  (удалить последний введённый символ) и комбинация клавиш  F   BS  (удалить все введённые символы).

Ввод завершается клавишей  Ввод . Курсор уберётся с индикатора, оставшись сразу после последнего введённого символа. При этом введённая строка располагается в памяти, начиная с адреса a. В стек заносится u2 — число реально введённых символов. Слово ACCEPT не позволит ввести больше символов, чем u1.

Ввод слова ACCEPT[править]

В режиме ЛАТ последовательно нажмите клавиши  ШГ←   С/П   С/П   ИП   6   2 

ACCEPT в стандарте ANS Forth[править]

 6.1.0695   ACCEPT                                                          CORE
            ( c-addr +n1 -- +n2 )
            Получает строку с максимумом +n1 символов. Неопределенная ситуация 
            существует, если +n1 нулевое или больше чем 32767. Отображает 
            полученные графические символы. Программа, которая зависит от 
            присутствия или отсутствия неграфических символов в строке имеет 
            зависимость от окружающей среды. Функции редактирования, если 
            таковые вообще имеются, которые система исполняет при создании 
            строки - определенное реализацией.

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

            +n2 - длина строки, сохраненной в c-addr.

 A.6.1.0695   ACCEPT
 Предыдущие стандарты определяли, что накопление входной строки заканчивается, 
 когда получен "возврат" или когда было получено +n1 символов. Завершение, когда 
 было получено +n1 символов, трудно, дорого, или невозможно осуществить в 
 некоторых системных средах. Следовательно, множество существующих реализаций не 
 подчиняется с этим требованиям.

 Так как редактирование строки и функции накопления часто реализуются системными 
 компонентами вне контроля реализацией Forth, этот Стандарт не налагает никакое 
 такое требование. Стандартная Программа может только предполагать, что она 
 может получать ввод строки от ACCEPT или EXPECT. Детальная последовательность 
 пользовательских действий, необходимых для подготовки и передачи этой строки, 
 вне контекста этого Стандарта.

 Спецификация ненулевого, положительного целочисленного счетчика (+n1) для 
 ACCEPT позволяет некоторым разработчикам продолжать их практику использования 
 нуля или отрицательной величины как флага для вызова специального поведения. 
 Поскольку такое поведение вне Стандарта, Стандартные программы не могут 
 зависеть от этого, но Технический Комитет не желает излишне препятствовать 
 этому. Так как фактические значения - почти всегда маленькие целые числа, 
 никакие функциональные возможности не повреждаются этим ограничением.

 ACCEPT и EXPECT исполняют схожие функции. ACCEPT рекомендуется для новых 
 программ, и будущее использование EXPECT не одобряется.

 Рекомендуется, чтобы все неграфические символы были зарезервированы для функций 
 редактирования или управления и не были сохранены во входной строке.

 Обычно, когда пользователь готовит входную строку, которая будет передана 
 программе, система позволяет пользователю редактировать эту строку и исправлять 
 ошибки перед передачей заключительной версии строки. Функция редактирования 
 предоставлена иногда непосредственно Forth системой, и иногда внешним системным 
 программным обеспечением или аппаратными средствами. Таким образом, управляющие 
 символы и функции не могут быть доступны на всех системах. В обычном случае 
 конец процесса редактирования и заключительной передачи строки обозначается 
 пользователем нажатием клавиши "Return" или "Enter".

 Как в предыдущих стандартах, EXPECT возвращает входную строку немедленно после 
 ввода требуемого числа символов, а также когда получен признак конца строки. 
 Широко рассматриваемое поведение "автоматического завершения, после того как 
 было введено определенное количество символов" нежелательно, потому что 
 пользователь "потеряет контроль" процесса входного редактирования в 
 потенциально неизвестное время (пользователь не обязательно знает, сколько 
 символов требовалось от, EXPECT). Таким образом, EXPECT и SPAN были сделаны 
 устаревшими и существуют в Стандарте только как уступка существующим 
 реализациям. Если EXPECT существует в Стандартной Системе, оно должно иметь 
 поведение "автоматического завершения".

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

История[править]

Слово EXPECT появилось в Форте в 1965 году, когда Чак Мур подрабатывал наёмным программистом в городе Нью-Йорк. Тогда появились миникомпьютеры, а с ними и терминалы. Интерпретатор был идеален для ввода с телетайпа.

В то время EXPECT был циклом, вызывающим KEY для чтения нажатий на клавиши.

В 1994 году стандарт ANS рекомендовал использовать улучшенное слово ACCEPT вместо устаревшего слова EXPECT

Это новое слово ACCEPT и вошло в первую версию Каллисто.

Реализация[править]

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

Реализация из SP-Forth 4.20:

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!

Советская реализация EXPECT[править]

Юрий Семёнов приводит следующее описание слова EXPECT через цикл DO (стр. 65-66):

 : EXPECT          ( в стеке адрес ввода и максимальное число
                     вводимых символов)
         0 DO     ( начало цикла, в стеке только адрес ввода)
            KEY ↑ 13 =           ( введённый символ <ВК> ? )
            IF ( если да, то ) LEAVE DROP 0 ( уход из цикла,
                 если нажата клавиша <ВК>)
            THEN OVER C!       ( запись очередного символа в
                                 буфер)
            1+            ( в стеке адрес, куда будет введён
                            следующий байт)
         LOOP                                 ( конец цикла)
         2 ERASE ;     ( запись нулей в два последних байта)

Определение слова EXPECT в ядре ФОРТ-ЕС использует примитив (EXPECT)

Вот их опубликованные описания и определения:

  (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 ;

В FORTH ИТЭФ слово EXPECT также было примитивом, обёрткой вокруг соответствующей функции DOS. Вот его определение:


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

             MOV   AL, BYTE PTR [BX+1]
             SUB   AH, AH
             ADD   BX, AX
             MOV   WORD PTR [BX+2],0
             NEXT

Ссылки[править]


  У этой статьи нет иллюстраций. Вы можете помочь проекту, добавив их.


  Это заготовка статьи. Вы можете помочь проекту, дополнив её.