REPL интерактивный интерпретатор
YaoXiang REPL (Read-Eval-Print Loop) — это интерактивная среда выполнения кода, позволяющая построчно вводить и выполнять код YaoXiang. Она идеально подходит для обучения, тестирования и отладки.
Быстрый старт
Запуск REPL
Выполните следующую команду в терминале для запуска REPL:
yaoxiang replИли запустите yaoxiang без аргументов:
yaoxiangПосле запуска появится приглашение:
YaoXiang REPL - Type :help for assistance
Press Ctrl+D or :quit to exit
>>Основы использования
Введите код YaoXiang после приглашения >> и нажмите Enter для выполнения:
>> 1 + 2
3
>> "Hello, World!"
"Hello, World!"
>> x = 10
>> x * 2
20Выход из REPL
Существует три способа выйти из REPL:
- Горячая клавиша: нажмите
Ctrl+D - Команда: введите
:quitили:q - Прерывание: нажмите
Ctrl+Cдля прерывания текущего ввода
Система команд
REPL предоставляет набор специальных команд, начинающихся с двоеточия :.
Команда помощи
>> :helpПоказывает справку по всем доступным командам.
Команда выхода
>> :quitВыход из REPL. Можно использовать сокращение :q.
Команда очистки
>> :clearОчищает все определённые переменные и функции, сбрасывает состояние REPL. Можно использовать сокращение :c.
Команда просмотра типа
>> :type xПоказывает информацию о типе символа x. Можно использовать сокращение :t.
Примеры:
>> name = "YaoXiang"
>> :type name
name: String
>> add: (a: Int, b: Int) -> Int = a + b
>> :type add
add: fn(Int, Int) -> IntКоманда списка символов
>> :symbolsВыводит список всех определённых в текущем REPL символов (переменных и функций). Можно использовать сокращения :i или :info.
Примеры:
>> x = 10
>> y = 20
>> greet: (name: String) -> String = "Hello, " + name
>> :symbols
x: Int
y: Int
greet: fn(String) -> StringКоманда истории
>> :historyПоказывает историю команд. Можно использовать сокращение :hist.
Команда статистики
>> :statsПоказывает статистику выполнения, включая количество вычислений и общее время выполнения.
Пример:
>> :stats
Eval count: 5
Total time: 12.34msВыполнение кода
Выполнение выражений
REPL может выполнять любые допустимые выражения YaoXiang:
>> 1 + 2
3
>> 10 * 5 + 3
53
>> "Hello" + " " + "World"
"Hello World"
>> true && false
falseОпределение переменных
Определяйте переменные напрямую по имени:
>> name = "YaoXiang"
>> age = 25
>> pi = 3.14159Можно также явно указать тип:
>> name: String = "YaoXiang"
>> age: Int = 25После определения переменные можно использовать в последующем коде:
>> name
"YaoXiang"
>> age + 5
30Определение функций
В YaoXiang нет ключевого слова fn — функции являются значениями с сигнатурой:
>> add: (a: Int, b: Int) -> Int = a + b
>> greet: (name: String) -> String = "Hello, " + nameВызов функций:
>> add(3, 4)
7
>> greet("World")
"Hello World"Многострочный код
REPL поддерживает ввод многострочного кода. При обнаружении незавершённого кода (например, незакрытых скобок) автоматически активируется режим продолжения строки:
>> factorial: (n: Int) -> Int = {
.. if n <= 1 { return 1 }
.. return n * factorial(n - 1)
.. }Приглашение для продолжения строки — .., указывающее на режим многострочного ввода.
Определение типов
>> Point: Type = { x: Float, y: Float }Определение вариантных типов (перечислений)
>> Color: Type = { red: () -> Color, green: () -> Color, blue: () -> Color }Автодополнение
REPL предоставляет интеллектуальную функцию автодополнения, помогающую быстро вводить код.
Способы активации
Нажмите клавишу Tab для вызова автодополнения.
Что дополняется
- Дополнение ключевых слов: ключевые слова языка YaoXiang (нажмите Tab для раскрытия)
- Дополнение символов: имена определённых переменных и функций
- Дополнение встроенных функций:
print,len,range,typeof,assertи другие встроенные функции
Примеры дополнения
>> 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 отображает подробную информацию:
>> x = 10 / 0
Error: Runtime error: DivisionByZero
>> undefined_variable
Error: Unknown symbol: undefined_variableОшибки не прерывают сеанс REPL — можно продолжать вводить новый код.
История команд
REPL автоматически сохраняет историю команд с поддержкой:
- Стрелки вверх/вниз: просмотр истории команд
- Поиск: введите часть текста и используйте стрелки вверх/вниз для поиска
- Файл истории: записи сохраняются в файле и автоматически загружаются при следующем запуске
Статистика выполнения
Используйте команду :stats для просмотра статистики выполнения:
>> :stats
Eval count: 15
Total time: 45.67msЭто помогает отслеживать производительность кода.
Лучшие практики
1. Используйте содержательные имена переменных
// Хорошо
user_name = "YaoXiang"
max_retries = 3
// Плохо
x = "YaoXiang"
n = 32. Определяйте функции для повторного использования кода
>> is_even: (n: Int) -> Bool = n % 2 == 0
>> is_even(4)
true
>> is_even(7)
false3. Используйте :clear для сброса состояния
Когда состояние REPL становится запутанным, используйте :clear:
>> :clear
Context cleared4. Используйте автодополнение для повышения эффективности
Введите первые символы и нажмите Tab для быстрого дополнения имён переменных и функций.
5. Используйте многострочный ввод для сложного кода
>> fibonacci: (n: Int) -> Int = {
.. if n <= 1 { return n }
.. return fibonacci(n - 1) + fibonacci(n - 2)
.. }Часто задаваемые вопросы
В: Как просмотреть определение функции?
О: Используйте команду :type для просмотра сигнатуры функции:
>> :type my_function
my_function: fn(Int, String) -> BoolВ: Как очистить все определения?
О: Используйте команду :clear:
>> :clearВ: Почему мой многострочный код не выполняется?
О: Проверьте наличие незакрытых скобок, кавычек или фигурных скобок. REPL ожидает полного ввода кода.
В: Как прервать долго выполняющийся код?
О: Нажмите Ctrl+C для прерывания текущего выполнения.
В: Какие типы данных поддерживает REPL?
О: REPL поддерживает все типы данных YaoXiang:
Int: целые числаFloat: числа с плавающей точкойString: строкиBool: булевы значенияVoid: пустой тип- Пользовательские записи и вариантные типы
Пример сессии
Пример полного сеанса работы с REPL:
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 | — | Статистика выполнения |
