Участник:Be nt all/Factor/Первое знакомство

Материал из Викиверситета

Первое знакомство с языком Factor[править]

Первое, что мы должны сделать — это установить Factor на свой компьютер. Вы можете скачать с factorcode.org стабильный или тестовый релиз, либо же получить с GutHub по адресу github.com/slavapestov/factor последнюю версию исходного кода системы, и собрать её самостоятельно (см. Factor/Сборка из исходного кода).

Если вы работаете под Windows — просто распакуйте содержимое архива factor-winnt-x86-32-x.xx.zip в любое удобное для вас место (например в корень диска C: или в Program Files) и запустите factor/factor.exe. Мы увидим примерно следующее:


Заголовок появившегося окна гласит „listener“ (дословно — «слушатель») — это одна из подсистем фактора, представляющая собой диалоговую консоль фактора, это удобный инструмент для отладки приложения в стиле REPL и экспериментов с языком.


Если мы последуем совету: „Press F1 at any time for help“ и нажмём   F1 , откроется окно браузера документации:


Настоятельно рекомендую обращаться к этой документации почаще (что, разумеется, требует хотя бы минимального знания английского языка).

Ну а пока нам пора знакомится с основными возможностями языка.

Hello World[править]

По традиции знакомство с новым языком программирования начинают с того, что учат его приветствовать мир:

непосредственное исполнение

"Здравствуй, мир!" print

Мы только что ввели в диалоговой консоли команду, которая вывела на экран сакраментальное приветствие миру. Однако, это ведь ещё не совсем программа, разве нет? Сейчас мы это поправим:

определение слова

: hello ( -- ) "Здравствуй, мир!" print ;

hello

Первой строчкой мы добавили в фактор-систему новую подпрограмму (в терминах стековых языков — слово), второй — выполнили его.

Рассмотрим правила создания новых слов:

  1. Определение слова начинается с двоеточия (:).
  2. Вслед за двоеточием, пишется имя определяемого слова (hello).
  3. За именем следует так называемое описание стекового эффекта, которое соответствует прототипу функции языка Си. Поскольку у нашего первого слова пока нет никаких аргументов и возвращаемых результатов, мы пишем просто ( -- ). Подробней о стековом эффекте мы узнаем, когда познакомимся со стеком.
  4. Затем следует само определение слова, в стековых языках оно, чаще всего, представляет собой ту же последовательность команд, которую мы выполняем для совершения неких действий в диалоговой консоли. Если определение пусто — слово не будет ничего делать.
  5. И, наконец, завершает определение слова точка с запятой (;), означающая его конец. Перед ней должен быть хотя бы один пробел.

Ещё раз обращаю ваше внимание на использование пробелов — в общем и целом, в таких языках, как factor или forth они используются куда чаще, чем в других, более привычных языках программирования. Дело в том, что в стековых языках почти нет каких-то особых сущностей, вроде ключевых слов или знаков пунктуации. К примеру, и двоеточие, с которого начинается определение нового слова, и точка с запятой, которой оно заканчивается — представляют собой не что иное, как определённые специальным образом слова-подпрограммы. Это особенность, делающая такие языки, как forth или factor потрясающе гибкими. Но к этому вопросу мы вернёмся позже.

А теперь — давайте посмотрим, может ли наша программа сказать «Здравствуй, мир!» не из консоли, а из отдельного окошка. Введите

GUI

USING: ui ui.gadgets.labels ;
MAIN-WINDOW: hellow { { title ":-)" } }
    "Здравствуй, мир!" <label> >>gadgets ;

hellow

Итак, наше новое слово hellow делает именно то, что мы хотели — открывает окошко, и приветствует из него мир. Думаю, что пока всё не слишком понятно — просто отметьте для себя пару моментов:

  • Слово USING: позволяет подключать дополнительные библиотеки (которые здесь называют словари)
  • Существуют другие слова для определения новых слов, помимо простого двоеточия, к примеру MAIN-WINDOW:

Продолжим, и поскольку factor, это «стековый язык», то нам пора познакомится со стеком.

Знакомство со стеком[править]

Стек — это очень удобная структура данных, в частности использование стека при вызове подпрограмм делает возможной рекурсию (см. Стек вызовов). Что же отличает стековые языки от всех остальных языков программирования, при реализации которых тоже никак не обойтись без стека? Дело в том, что в подобных языках используется дополнительный стек данных: на нём хранят все (ну, почти) промежуточные результаты вычислений, через него предаются аргументы подпрограмм (которые мы, напомню, называем словами) и возвращаются результат их работы.

Посмотрим, как это работает на практике.