Как стать автором
Обновить

Создаем простое GUI приложение на APL

Время на прочтение4 мин
Количество просмотров1.9K
Всем привет! Появившаяся недавно на Хабре статья, посвященная языку APL, на мой взгляд, не столько описала, сколько усложнила этот довольно простой и логичный язык. Я решил попытаться доказать что APL — это просто! Для этого я покажу вам, как написать на APL небольшое GUI приложение с использованием интерпретатора компании Dyalog, так как собственно сам язык APL состоит из пары десятков примитивов (те самые «закорючки») и всё. Параллельно постараюсь объяснить значение используемых примитивов и особенности разработки в Dyalog APL (много картинок!).
Итак, «Угадай Число» на APL!

Функции


Тысячи их!Как в любом интерпретируемом языке исполняемый код содержится в функциях, которые, в свою очередь, могут вызывать другие функции, и так далее. Соответственно, приложение будет представлять собой некую «главную» функцию вызывающую все остальные.
В Dyalog APL есть несколько способов создать новую функцию. Самым простым будет ввести в командной строке интерпретатора )ED имя функции и нажать ENTER. Появится окно редактора, в котором, собственно, и происходит разработка кода.

1

Первым делом необходимо написать заголовок функции. В Dyalog APL функции могут быть без аргументов (nyladic), с одним аргументом (monadic), с двумя аргументами (dyadic), или с переменным (один или два) количеством аргументов (ambivalence). Кроме того, функции могут возвращать или не возвращать результат. В нашем случае «главная» функция будет с одним аргументом и без возвращаемого результата.

2

Аргумент fName будет символьным вектором, содержащим заголовок окна. В Dyalog APL отсутствует явное указание типов, поэтому необходимо использовать различные проверки или механизмы обработки исключений. В данном примере я их использовать не буду, оставлю всё на совести пользователей.
Также в заголовке функции определяются локальные переменные. В нашем случае это переменная number, содержащая значение генерируемого программой случайного числа, и переменная Win, которая будет представлять собой пространство имен формы, содержащее все её элементы.
После заголовка функции следует исполняемый код. Сначала необходимо описать параметры формы и ее элементов.
Графические элементы создаются системной функцией []WC (все системные функции начинаются с «)» либо с «[]»(это прямоугольник, но я буду использовать приближение)). Правым аргументом является пространство имен либо элемент пространства имен, левым — тип создаваемого элемента и его параметры. Нам необходимо создать саму форму, поле для ввода, кнопку и текст.

3

Обратите внимание, что для кнопки указан тип события – ‘Event’ ‘Select’, и функция-обработчик (Callback function) — checkNum, которая будет выполняться при нажатии.
Далее необходимо сгенерировать случайное число и поместить его в переменную. В APL для этого служит monadic функция «Roll», обозначаемая примитивом «?». Её аргументом является предел диапазона генерируемых значений. В нашем случае это число 10.

4

Вот, собственно, практически весь код, необходимый для создания формы. Осталось только определить Callback функцию для кнопки и добавить строку запуска событий формы. Последнее выполняется просто — вызов системной функции []DQ с пространством имен формы связывает все элементы формы с функциями и выполняет их при наступлении события.
Таким образом, полный текст функции WhatNum будет выглядеть так:

5

Для сохранения функции в рабочей области достаточно нажать Esc, или выбрать в меню File->Exit (and Fix).

6

Для редактирования Callback функции можно воспользоватся уже известным способом — )ED имя функции (в нашем случае — checkNum). Появится экран редактора. Последовательность действий та же: заголовок, тело.
Наша функция должна считывать вводимое значение, сверять его с «загаданным» и выводить подсказку. Если пользователь угадал число, через 2 сек. начинается новый раунд.
Напишем заголовок:

7

где inp – локальная переменная, содержащая вводимый пользователем текст. Далее необходимо написать проверку на равенство введенного числа. В Dyalog APL для этого можно использовать конструкции :If :Else :EndIf. Итак, проверка:

8

Не забываем, что вычисления идут справа налево, но выражение в скобках выполняется первым. Если введенное число совпало, в текстовую метку выводится «Right!» и через 2 секунды программа «загадывает» новое число. Задержка реализуется системной функцией []DL, аргументом которой является величина задержки в секундах.
Вторая ветка условия будет выглядеть так:

9

Вот и всё. Сохраняем изменения клавишей Esc или через меню попадаем обратно в окно интерпретатора.
Чтобы увидеть результат, необходимо запустить «главную» функцию приложения, а именно WhatNum, передав ей аргумент имя формы в одинарных кавычках.

10

Введя число в поле для ввода и нажав на кнопку «Answer» мы увидим результат действия Callback функции.

11

Что дальше?


Ну вот, теперь у нас есть работающий код приложения. Теперь его нужно сохранить!
В Dyalog APL самый простой способ хранения – это рабочая область. Для сохранения рабочей области достаточно ввести )SAVE и файл рабочей области (*.dws) будет сохранен.
Теперь небольшая хитрость. Чтобы каждый раз не запускать функцию руками, можно воспользоваться системной переменной []LX. В этой переменной хранятся выражения, которые будут выполнены при загрузке рабочей области. Выражения записываются в одинарных кавычках (но кавычки внутри экранируются второй кавычкой), а чтобы объединить несколько выражений в одну строку используется специальный примитив (ромбик на рисунке ниже):

12

Я добавил выражение выхода из интерпретатора, чтобы поведение рабочей области было похоже на настоящую программу, но это конечно же, дело разработчика. И не забудте сохранить изменения в рабочей области!
Теперь можно запускать наш код двойным кликом мышки на файле рабочей области. Однако теперь, чтобы внести изменения в исполняемый код, необходимо будет прерывать исполнение программы при помощи нажатия клавиш «CTRL+BREAK». В появившемся окне дебаггера следует выбрать в меню «Exit» или просто нажать «Esc».

13

Теперь можно воспользоваться описанными выше средствами для редактирования функций.

Вот и Всё, ребята


В данной статье я лишь чуть-чуть приоткрыл занавес над «удивительным и загадочным» миром языка APL. Надеюсь, теперь он не кажется таким эзотерическим и недоступным простому смертному.
И да, с удовольствием постараюсь ответить на ваши вопросы.
Теги:
Хабы:
Всего голосов 7: ↑6 и ↓1+5
Комментарии3

Публикации