Как пользоваться онлайн-интерпретатором Scheme
- Напишите или вставьте код на Scheme в редактор. Кнопка Сбросить пример возвращает стартовую программу, которая выводит факториал, первые десять чисел Фибоначчи и сумму квадратов.
- Нажмите Запустить или используйте Ctrl + Enter (⌘ + Enter на Mac).
- Текст, выведенный с помощью
display,writeиnewline, появляется на панели Результат. Когда программа завершается, значение последнего выражения выводится в виде=> значение, если только оно не является неопределённым. Об ошибках сообщается собственным текстом BiwaScheme. - Выберите ограничение времени — 5, 15 или 60 секунд. Бесконечный цикл останавливается автоматически, а кнопка Остановить немедленно прекращает запуск.
Интерпретатор занимает всего около 0,3 МБ, поэтому страница готова почти сразу. Кнопки Копировать и main.scm сохраняют вашу программу, а Полноэкранный режим (Ctrl/⌘ + Shift + F, выход — Esc) отдаёт редактору всё окно.
Ваш код выполняется в Web Worker внутри браузера и никогда не отправляется на сервер. Редактор автоматически сохраняет вашу последнюю программу в локальном хранилище браузера отдельно для каждого компилятора на этом сайте.
О Scheme и BiwaScheme
Scheme — небольшой диалект Lisp. Программы состоят из выражений в скобках, функции — обычные значения, а рекурсия — привычный способ организовать цикл. Крошечное ядро делает его популярным учебным языком для замыканий, функций высшего порядка и интерпретаторов.
На этой странице работает BiwaScheme 0.8.3 — интерпретатор Scheme, написанный на JavaScript. По духу он следует стандартам R6RS и R7RS и охватывает самые распространённые возможности Scheme. Однако он не является полной реализацией ни одного из этих стандартов.
Что поддерживается
- Основные формы:
define,lambda,let,let*,letrec,if,cond,beginиset!. - Списки и функции высшего порядка:
cons,car,cdr,list,map,applyи квотированные данные вроде'(1 2 3). - Полноценная оптимизация хвостовых вызовов, поэтому циклы, записанные как именованный
letили хвостово-рекурсивные функции, выполняются с постоянным размером стека.
Ограничения:
- Нет поля ввода. Тестовые данные вписывайте прямо в программу.
- Это не полная реализация стандарта. Процедуры, специфичные для других Scheme, например MIT Scheme, Racket или Guile, могут отсутствовать.
- Выполняется только код из редактора. Загружать файлы нельзя, менеджера пакетов нет.
Пример: рекурсия и именованный let
;; Обычная рекурсия: каждый вызов ждёт, пока вернётся следующий.
(define (sum-list lst)
(if (null? lst)
0
(+ (car lst) (sum-list (cdr lst)))))
;; Именованный let: хвостово-рекурсивный цикл с накопителем.
(define (sum-to n)
(let loop ((i 1) (acc 0))
(if (> i n)
acc
(loop (+ i 1) (+ acc i)))))
(display (sum-list '(1 2 3 4))) (newline) ; 10
(sum-to 100000) ; => 5000050000
Последнее выражение не выводится, поэтому его значение появляется как => 5000050000. sum-list накапливает отложенные сложения, а sum-to вызывает loop в хвостовой позиции и работает как цикл while.
Типичные ошибки
- Забыли квотировать список.
(1 2 3)пытается вызвать1как функцию и завершается ошибкой. Пишите'(1 2 3)или(list 1 2 3). Это разные вещи:'(a b)— список из символовaиb, а(list a b)вычисляет переменные. defineиlet.defineна верхнем уровне создаёт глобальное имя.letсоздаёт локальные имена, существующие только внутри его тела. Внутри обычногоletодна привязка не может ссылаться на другую, поэтому используйтеlet*, когда последующее значение зависит от предыдущего.displayиwrite.displayвыводит строки без кавычек.writeих сохраняет, что помогает при отладке данных.- Равенство. Используйте
=для чисел,eq?для символов иequal?, чтобы сравнивать списки или строки по содержимому.
Часто задаваемые вопросы
Это компилятор или интерпретатор Scheme?
Интерпретатор. BiwaScheme выполняет вашу программу прямо в браузере, без отдельного этапа компиляции.
Какой стандарт Scheme поддерживается?
BiwaScheme по духу следует R6RS и R7RS и охватывает самые распространённые возможности. Стандартный учебный код с define, lambda, let, cond, списками и рекурсией работает как ожидается. Код, зависящий от библиотек конкретной реализации, может потребовать правок.
Можно ли использовать его для SICP или учебных заданий?
Да, для заданий на основе базовой части Scheme. Если в задании используется неопределённая процедура, напишите её упрощённую версию сами в начале программы.
Почему моя программа ничего не выводит?
Вывод создают только display, write и newline, а также строка => со значением последнего выражения. Программа, которая заканчивается на define, не показывает значения, потому что этот результат не определён.
На каких ещё языках можно запускать код онлайн?
Попробуйте онлайн-компилятор Clojure для другого Lisp, онлайн-компилятор Prolog для логического программирования или посмотрите все онлайн-компиляторы.
Обновлено