Skip to content

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

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

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

Запуск REPL ​

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

bash
yx 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 and 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: пустой тип
  • Пользовательские record type и enum type

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

Ниже приведён полный пример сессии 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-Показать статистику выполнения