REPL Интерактивный интерпретатор
YaoXiang REPL (Read-Eval-Print Loop) — это интерактивная среда выполнения кода, позволяющая вводить и выполнять код YaoXiang построчно, что идеально подходит для обучения, тестирования и отладки.
Быстрый старт
Запуск REPL
Выполните следующую команду в терминале для запуска REPL:
yx 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 and 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: пустой тип- Пользовательские record type и enum type
Пример сессии
Ниже приведён полный пример сессии 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 | - | Показать статистику выполнения |
