Всем привет! Появившаяся недавно на Хабре статья, посвященная языку APL, на мой взгляд, не столько описала, сколько усложнила этот довольно простой и логичный язык. Я решил попытаться доказать что APL — это просто! Для этого я покажу вам, как написать на APL небольшое GUI приложение с использованием интерпретатора компании Dyalog, так как собственно сам язык APL состоит из пары десятков примитивов (те самые «закорючки») и всё. Параллельно постараюсь объяснить значение используемых примитивов и особенности разработки в Dyalog APL (много картинок!).
Итак, «Угадай Число» на APL!
Тысячи их!Как в любом интерпретируемом языке исполняемый код содержится в функциях, которые, в свою очередь, могут вызывать другие функции, и так далее. Соответственно, приложение будет представлять собой некую «главную» функцию вызывающую все остальные.
В Dyalog APL есть несколько способов создать новую функцию. Самым простым будет ввести в командной строке интерпретатора )ED имя функции и нажать ENTER. Появится окно редактора, в котором, собственно, и происходит разработка кода.
Первым делом необходимо написать заголовок функции. В Dyalog APL функции могут быть без аргументов (nyladic), с одним аргументом (monadic), с двумя аргументами (dyadic), или с переменным (один или два) количеством аргументов (ambivalence). Кроме того, функции могут возвращать или не возвращать результат. В нашем случае «главная» функция будет с одним аргументом и без возвращаемого результата.
Аргумент fName будет символьным вектором, содержащим заголовок окна. В Dyalog APL отсутствует явное указание типов, поэтому необходимо использовать различные проверки или механизмы обработки исключений. В данном примере я их использовать не буду, оставлю всё на совести пользователей.
Также в заголовке функции определяются локальные переменные. В нашем случае это переменная number, содержащая значение генерируемого программой случайного числа, и переменная Win, которая будет представлять собой пространство имен формы, содержащее все её элементы.
После заголовка функции следует исполняемый код. Сначала необходимо описать параметры формы и ее элементов.
Графические элементы создаются системной функцией []WC (все системные функции начинаются с «)» либо с «[]»(это прямоугольник, но я буду использовать приближение)). Правым аргументом является пространство имен либо элемент пространства имен, левым — тип создаваемого элемента и его параметры. Нам необходимо создать саму форму, поле для ввода, кнопку и текст.
Обратите внимание, что для кнопки указан тип события – ‘Event’ ‘Select’, и функция-обработчик (Callback function) — checkNum, которая будет выполняться при нажатии.
Далее необходимо сгенерировать случайное число и поместить его в переменную. В APL для этого служит monadic функция «Roll», обозначаемая примитивом «?». Её аргументом является предел диапазона генерируемых значений. В нашем случае это число 10.
Вот, собственно, практически весь код, необходимый для создания формы. Осталось только определить Callback функцию для кнопки и добавить строку запуска событий формы. Последнее выполняется просто — вызов системной функции []DQ с пространством имен формы связывает все элементы формы с функциями и выполняет их при наступлении события.
Таким образом, полный текст функции WhatNum будет выглядеть так:
Для сохранения функции в рабочей области достаточно нажать Esc, или выбрать в меню File->Exit (and Fix).
Для редактирования Callback функции можно воспользоватся уже известным способом — )ED имя функции (в нашем случае — checkNum). Появится экран редактора. Последовательность действий та же: заголовок, тело.
Наша функция должна считывать вводимое значение, сверять его с «загаданным» и выводить подсказку. Если пользователь угадал число, через 2 сек. начинается новый раунд.
Напишем заголовок:
где inp – локальная переменная, содержащая вводимый пользователем текст. Далее необходимо написать проверку на равенство введенного числа. В Dyalog APL для этого можно использовать конструкции :If :Else :EndIf. Итак, проверка:
Не забываем, что вычисления идут справа налево, но выражение в скобках выполняется первым. Если введенное число совпало, в текстовую метку выводится «Right!» и через 2 секунды программа «загадывает» новое число. Задержка реализуется системной функцией []DL, аргументом которой является величина задержки в секундах.
Вторая ветка условия будет выглядеть так:
Вот и всё. Сохраняем изменения клавишей Esc или через меню попадаем обратно в окно интерпретатора.
Чтобы увидеть результат, необходимо запустить «главную» функцию приложения, а именно WhatNum, передав ей аргумент имя формы в одинарных кавычках.
Введя число в поле для ввода и нажав на кнопку «Answer» мы увидим результат действия Callback функции.
Ну вот, теперь у нас есть работающий код приложения. Теперь его нужно сохранить!
В Dyalog APL самый простой способ хранения – это рабочая область. Для сохранения рабочей области достаточно ввести )SAVE и файл рабочей области (*.dws) будет сохранен.
Теперь небольшая хитрость. Чтобы каждый раз не запускать функцию руками, можно воспользоваться системной переменной []LX. В этой переменной хранятся выражения, которые будут выполнены при загрузке рабочей области. Выражения записываются в одинарных кавычках (но кавычки внутри экранируются второй кавычкой), а чтобы объединить несколько выражений в одну строку используется специальный примитив (ромбик на рисунке ниже):
Я добавил выражение выхода из интерпретатора, чтобы поведение рабочей области было похоже на настоящую программу, но это конечно же, дело разработчика. И не забудте сохранить изменения в рабочей области!
Теперь можно запускать наш код двойным кликом мышки на файле рабочей области. Однако теперь, чтобы внести изменения в исполняемый код, необходимо будет прерывать исполнение программы при помощи нажатия клавиш «CTRL+BREAK». В появившемся окне дебаггера следует выбрать в меню «Exit» или просто нажать «Esc».
Теперь можно воспользоваться описанными выше средствами для редактирования функций.
В данной статье я лишь чуть-чуть приоткрыл занавес над «удивительным и загадочным» миром языка APL. Надеюсь, теперь он не кажется таким эзотерическим и недоступным простому смертному.
И да, с удовольствием постараюсь ответить на ваши вопросы.
Итак, «Угадай Число» на APL!
Функции
В Dyalog APL есть несколько способов создать новую функцию. Самым простым будет ввести в командной строке интерпретатора )ED имя функции и нажать ENTER. Появится окно редактора, в котором, собственно, и происходит разработка кода.
Первым делом необходимо написать заголовок функции. В Dyalog APL функции могут быть без аргументов (nyladic), с одним аргументом (monadic), с двумя аргументами (dyadic), или с переменным (один или два) количеством аргументов (ambivalence). Кроме того, функции могут возвращать или не возвращать результат. В нашем случае «главная» функция будет с одним аргументом и без возвращаемого результата.
Аргумент fName будет символьным вектором, содержащим заголовок окна. В Dyalog APL отсутствует явное указание типов, поэтому необходимо использовать различные проверки или механизмы обработки исключений. В данном примере я их использовать не буду, оставлю всё на совести пользователей.
Также в заголовке функции определяются локальные переменные. В нашем случае это переменная number, содержащая значение генерируемого программой случайного числа, и переменная Win, которая будет представлять собой пространство имен формы, содержащее все её элементы.
После заголовка функции следует исполняемый код. Сначала необходимо описать параметры формы и ее элементов.
Графические элементы создаются системной функцией []WC (все системные функции начинаются с «)» либо с «[]»(это прямоугольник, но я буду использовать приближение)). Правым аргументом является пространство имен либо элемент пространства имен, левым — тип создаваемого элемента и его параметры. Нам необходимо создать саму форму, поле для ввода, кнопку и текст.
Обратите внимание, что для кнопки указан тип события – ‘Event’ ‘Select’, и функция-обработчик (Callback function) — checkNum, которая будет выполняться при нажатии.
Далее необходимо сгенерировать случайное число и поместить его в переменную. В APL для этого служит monadic функция «Roll», обозначаемая примитивом «?». Её аргументом является предел диапазона генерируемых значений. В нашем случае это число 10.
Вот, собственно, практически весь код, необходимый для создания формы. Осталось только определить Callback функцию для кнопки и добавить строку запуска событий формы. Последнее выполняется просто — вызов системной функции []DQ с пространством имен формы связывает все элементы формы с функциями и выполняет их при наступлении события.
Таким образом, полный текст функции WhatNum будет выглядеть так:
Для сохранения функции в рабочей области достаточно нажать Esc, или выбрать в меню File->Exit (and Fix).
Для редактирования Callback функции можно воспользоватся уже известным способом — )ED имя функции (в нашем случае — checkNum). Появится экран редактора. Последовательность действий та же: заголовок, тело.
Наша функция должна считывать вводимое значение, сверять его с «загаданным» и выводить подсказку. Если пользователь угадал число, через 2 сек. начинается новый раунд.
Напишем заголовок:
где inp – локальная переменная, содержащая вводимый пользователем текст. Далее необходимо написать проверку на равенство введенного числа. В Dyalog APL для этого можно использовать конструкции :If :Else :EndIf. Итак, проверка:
Не забываем, что вычисления идут справа налево, но выражение в скобках выполняется первым. Если введенное число совпало, в текстовую метку выводится «Right!» и через 2 секунды программа «загадывает» новое число. Задержка реализуется системной функцией []DL, аргументом которой является величина задержки в секундах.
Вторая ветка условия будет выглядеть так:
Вот и всё. Сохраняем изменения клавишей Esc или через меню попадаем обратно в окно интерпретатора.
Чтобы увидеть результат, необходимо запустить «главную» функцию приложения, а именно WhatNum, передав ей аргумент имя формы в одинарных кавычках.
Введя число в поле для ввода и нажав на кнопку «Answer» мы увидим результат действия Callback функции.
Что дальше?
Ну вот, теперь у нас есть работающий код приложения. Теперь его нужно сохранить!
В Dyalog APL самый простой способ хранения – это рабочая область. Для сохранения рабочей области достаточно ввести )SAVE и файл рабочей области (*.dws) будет сохранен.
Теперь небольшая хитрость. Чтобы каждый раз не запускать функцию руками, можно воспользоваться системной переменной []LX. В этой переменной хранятся выражения, которые будут выполнены при загрузке рабочей области. Выражения записываются в одинарных кавычках (но кавычки внутри экранируются второй кавычкой), а чтобы объединить несколько выражений в одну строку используется специальный примитив (ромбик на рисунке ниже):
Я добавил выражение выхода из интерпретатора, чтобы поведение рабочей области было похоже на настоящую программу, но это конечно же, дело разработчика. И не забудте сохранить изменения в рабочей области!
Теперь можно запускать наш код двойным кликом мышки на файле рабочей области. Однако теперь, чтобы внести изменения в исполняемый код, необходимо будет прерывать исполнение программы при помощи нажатия клавиш «CTRL+BREAK». В появившемся окне дебаггера следует выбрать в меню «Exit» или просто нажать «Esc».
Теперь можно воспользоваться описанными выше средствами для редактирования функций.
Вот и Всё, ребята
В данной статье я лишь чуть-чуть приоткрыл занавес над «удивительным и загадочным» миром языка APL. Надеюсь, теперь он не кажется таким эзотерическим и недоступным простому смертному.
И да, с удовольствием постараюсь ответить на ваши вопросы.