Skip to content

REPL интерактивный интерпретатор

YaoXiang REPL (Read-Eval-Print Loop) — это интерактивная среда выполнения кода, позволяющая построчно вводить и выполнять код YaoXiang. Она идеально подходит для обучения, тестирования и отладки.

Быстрый старт

Запуск REPL

Выполните следующую команду в терминале для запуска REPL:

bash
yaoxiang repl

Или запустите yaoxiang без аргументов:

bash
yaoxiang

После запуска появится приглашение:

YaoXiang REPL - Type :help for assistance
Press Ctrl+D or :quit to exit

>>

Основы использования

Введите код YaoXiang после приглашения >> и нажмите Enter для выполнения:

yaoxiang
>> 1 + 2
3

>> "Hello, World!"
"Hello, World!"

>> x = 10
>> x * 2
20

Выход из REPL

Существует три способа выйти из REPL:

  1. Горячая клавиша: нажмите Ctrl+D
  2. Команда: введите :quit или :q
  3. Прерывание: нажмите Ctrl+C для прерывания текущего ввода

Система команд

REPL предоставляет набор специальных команд, начинающихся с двоеточия :.

Команда помощи

yaoxiang
>> :help

Показывает справку по всем доступным командам.

Команда выхода

yaoxiang
>> :quit

Выход из REPL. Можно использовать сокращение :q.

Команда очистки

yaoxiang
>> :clear

Очищает все определённые переменные и функции, сбрасывает состояние REPL. Можно использовать сокращение :c.

Команда просмотра типа

yaoxiang
>> :type x

Показывает информацию о типе символа x. Можно использовать сокращение :t.

Примеры:

yaoxiang
>> name = "YaoXiang"
>> :type name
name: String

>> add: (a: Int, b: Int) -> Int = a + b
>> :type add
add: fn(Int, Int) -> Int

Команда списка символов

yaoxiang
>> :symbols

Выводит список всех определённых в текущем REPL символов (переменных и функций). Можно использовать сокращения :i или :info.

Примеры:

yaoxiang
>> x = 10
>> y = 20
>> greet: (name: String) -> String = "Hello, " + name
>> :symbols
x: Int
y: Int
greet: fn(String) -> String

Команда истории

yaoxiang
>> :history

Показывает историю команд. Можно использовать сокращение :hist.

Команда статистики

yaoxiang
>> :stats

Показывает статистику выполнения, включая количество вычислений и общее время выполнения.

Пример:

yaoxiang
>> :stats
Eval count: 5
Total time: 12.34ms

Выполнение кода

Выполнение выражений

REPL может выполнять любые допустимые выражения YaoXiang:

yaoxiang
>> 1 + 2
3

>> 10 * 5 + 3
53

>> "Hello" + " " + "World"
"Hello World"

>> true && false
false

Определение переменных

Определяйте переменные напрямую по имени:

yaoxiang
>> name = "YaoXiang"
>> age = 25
>> pi = 3.14159

Можно также явно указать тип:

yaoxiang
>> name: String = "YaoXiang"
>> age: Int = 25

После определения переменные можно использовать в последующем коде:

yaoxiang
>> name
"YaoXiang"

>> age + 5
30

Определение функций

В YaoXiang нет ключевого слова fn — функции являются значениями с сигнатурой:

yaoxiang
>> add: (a: Int, b: Int) -> Int = a + b
>> greet: (name: String) -> String = "Hello, " + name

Вызов функций:

yaoxiang
>> add(3, 4)
7

>> greet("World")
"Hello World"

Многострочный код

REPL поддерживает ввод многострочного кода. При обнаружении незавершённого кода (например, незакрытых скобок) автоматически активируется режим продолжения строки:

yaoxiang
>> factorial: (n: Int) -> Int = {
..     if n <= 1 { return 1 }
..     return n * factorial(n - 1)
.. }

Приглашение для продолжения строки — .., указывающее на режим многострочного ввода.

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

yaoxiang
>> Point: Type = { x: Float, y: Float }

Определение вариантных типов (перечислений)

yaoxiang
>> Color: Type = { red: () -> Color, green: () -> Color, blue: () -> Color }

Автодополнение

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

Способы активации

Нажмите клавишу Tab для вызова автодополнения.

Что дополняется

  1. Дополнение ключевых слов: ключевые слова языка YaoXiang (нажмите Tab для раскрытия)
  2. Дополнение символов: имена определённых переменных и функций
  3. Дополнение встроенных функций: print, len, range, typeof, assert и другие встроенные функции

Примеры дополнения

yaoxiang
>> my_variable = 42
>> my_<Tab>
my_variable: Int

>> calculate_sum: (a: Int, b: Int) -> Int = a + b
>> calc<Tab>
calculate_sum: fn(Int, Int) -> Int

Продвинутые функции

Обработка ошибок

При возникновении ошибок в коде REPL отображает подробную информацию:

yaoxiang
>> x = 10 / 0
Error: Runtime error: DivisionByZero

>> undefined_variable
Error: Unknown symbol: undefined_variable

Ошибки не прерывают сеанс REPL — можно продолжать вводить новый код.

История команд

REPL автоматически сохраняет историю команд с поддержкой:

  • Стрелки вверх/вниз: просмотр истории команд
  • Поиск: введите часть текста и используйте стрелки вверх/вниз для поиска
  • Файл истории: записи сохраняются в файле и автоматически загружаются при следующем запуске

Статистика выполнения

Используйте команду :stats для просмотра статистики выполнения:

yaoxiang
>> :stats
Eval count: 15
Total time: 45.67ms

Это помогает отслеживать производительность кода.

Лучшие практики

1. Используйте содержательные имена переменных

yaoxiang
// Хорошо
user_name = "YaoXiang"
max_retries = 3

// Плохо
x = "YaoXiang"
n = 3

2. Определяйте функции для повторного использования кода

yaoxiang
>> is_even: (n: Int) -> Bool = n % 2 == 0
>> is_even(4)
true
>> is_even(7)
false

3. Используйте :clear для сброса состояния

Когда состояние REPL становится запутанным, используйте :clear:

yaoxiang
>> :clear
Context cleared

4. Используйте автодополнение для повышения эффективности

Введите первые символы и нажмите Tab для быстрого дополнения имён переменных и функций.

5. Используйте многострочный ввод для сложного кода

yaoxiang
>> fibonacci: (n: Int) -> Int = {
..     if n <= 1 { return n }
..     return fibonacci(n - 1) + fibonacci(n - 2)
.. }

Часто задаваемые вопросы

В: Как просмотреть определение функции?

О: Используйте команду :type для просмотра сигнатуры функции:

yaoxiang
>> :type my_function
my_function: fn(Int, String) -> Bool

В: Как очистить все определения?

О: Используйте команду :clear:

yaoxiang
>> :clear

В: Почему мой многострочный код не выполняется?

О: Проверьте наличие незакрытых скобок, кавычек или фигурных скобок. REPL ожидает полного ввода кода.

В: Как прервать долго выполняющийся код?

О: Нажмите Ctrl+C для прерывания текущего выполнения.

В: Какие типы данных поддерживает REPL?

О: REPL поддерживает все типы данных YaoXiang:

  • Int: целые числа
  • Float: числа с плавающей точкой
  • String: строки
  • Bool: булевы значения
  • Void: пустой тип
  • Пользовательские записи и вариантные типы

Пример сессии

Пример полного сеанса работы с REPL:

yaoxiang
YaoXiang REPL - Type :help for assistance
Press Ctrl+D or :quit to exit

>> greeting = "Hello"
>> name = "YaoXiang"
>> greeting + ", " + name + "!"
"Hello, YaoXiang!"

>> factorial: (n: Int) -> Int = {
..     if n <= 1 { return 1 }
..     return n * factorial(n - 1)
.. }
..
>> factorial(5)
120

>> :symbols
greeting: String
name: String
factorial: fn(Int) -> Int

>> :stats
Eval count: 4
Total time: 2.34ms

>> :quit

Связанные команды

КомандаСокращениеФункция
:help:hПоказать справку
:quit:qВыйти из REPL
:clear:cОчистить всё
:type:tПоказать тип
:symbols:iСписок всех символов
:history:histИстория команд
:statsСтатистика выполнения