Страница 1 из 1

Как работает команда

Добавлено: 05 июн 2020, 10:25
Sertik
В одном скрипте Dragon Knight нашел вот это:

:local key ([:terminal inkey] - 48)

Такая команда будет работать только в терминале ? Из скрипта нельзя сделать ввод символа с клавиатуры ?

Re: Как работает команда

Добавлено: 05 июн 2020, 11:16
podarok66
Давайте рассуждать. :terminal inkey используется при интерактивном диалоге. Например :local key [:terminal inkey] будет ожидать нажатия клавиши и сохранит её ASCII представление в переменную key. Для y это будет 121, для n будет 110. Как это использовать в скрипте, который выполняется в фоне?

Re: Как работает команда

Добавлено: 05 июн 2020, 20:08
Sertik
Не понял совсем ничего. Кроме того, что да, в скрипте, это вероятно вообще никак использовать нельзя.
А в терминале пробовал - странная вещь выходит (с моей точки зрения):

Например,

:put "enter a character using the keyboard"
:local key ([:terminal inkey]-48)
:put $key
:put [:typeof $key]

Почему, выполняясь из терминала программа не ждет ввода с клавиатуры и не печатает на экран ни код введенного символа ни тип переменной $key ?

Re: Как работает команда

Добавлено: 06 июн 2020, 12:47
podarok66
Это я сейчас не понял. Раскладка клавиатуры английская.

Код: Выделить всё

[podarok66@RB750Gr3] > {{:put "enter a character using the keyboard"
{{... :local key ([:terminal inkey]-48)                             
{{... :put $key                        
{{... :put [:typeof $key]}}
Нажимаем Enter

Код: Выделить всё

enter a character using the keyboard
Я опять нажал Enter, так как терминал оказался в режиме ожидания

Код: Выделить всё

-35
num
[podarok66@RB750Gr3] > 
Что, по вашему, другое должно было случиться? Может вы перед этим с терминале нажимали Ctrl+v ?

Re: Как работает команда

Добавлено: 09 июн 2020, 10:21
Sertik
Да, работает.
У меня вот этот код не был заключен в фигурные скобки как у Вас

:put "enter a character using the keyboard"
:local key ([:terminal inkey]-48)
:put $key
:put [:typeof $key]

{:put "enter a character using the keyboard"
:local key ([:terminal inkey]-48)
:put $key
:put [:typeof $key]}

Поэтому никакого ожидания нажатия на клавишу не происходило. Кстати почему так ?
Так и не понял почему блок кода для выполнения в терминале правильно заключать в фигурные скобки ?

Re: Как работает команда

Добавлено: 09 июн 2020, 21:59
podarok66
Sertik писал(а): 09 июн 2020, 10:21 Так и не понял почему блок кода для выполнения в терминале правильно заключать в фигурные скобки ?
Насколько я понимаю, если не заключать код в фигурные скобки, то каждая команда завершается либо ; либо символом новой строки. Если заключить какой либо код в фигурные скобки, получаем локальную область, которая определяет свои переменные, не видные за скобками, но включает переменные, которые были определены на порядок выше. Все команды в такой области должны быть выполнены, так как рассматриваются системой, как одна строка. Верно и обратное: каждая строка, записанная в терминале, рассматривается как локальная область видимости. Поэтому вставляя в Терминал код из нескольких строк, получаем, что каждая строка определена лишь для себя самой и не определена для всех остальных.
Фух... Сумбурно, но я никогда не был силён в теоретезировании.

Re: Как работает команда

Добавлено: 10 июн 2020, 09:24
Sertik
Спасибо, не сумбурно, а очень нормально. Согласно Вашему последнему предложению (обратное утверждение) - это что же получается, что если код исполняемый в терминале не заключен в фигурные скобки например, состоит из нескольких строк, в одной строке допустим определяется переменная, а вторая строка про неё уже ничего не знает ? Вот здорово ! Значит нужно всё что для терминала заключать в фигурные скобки !

Re: Как работает команда

Добавлено: 10 июн 2020, 12:28
podarok66
Ну да, так оно и есть. Вот простейший эксперимент:

Код: Выделить всё

[podarok66@RB750Gr3] > :local t "Hello"
[podarok66@RB750Gr3] > :put $t

[podarok66@RB750Gr3] > 
Как мы видим, переменная t оказывается необъявленной во второй строке. Несмотря на то, что в первой мы её объявляли. Как-то так :ne_vi_del: