REPL имеет довольно специфическое значение. «True REPL» будет соответствовать следующему шаблону: Прочитать Eval Print Loop. Можно построить REPL в Clojure всего несколько строк:
(loop []
(let [string (read-line)
data (read-string line)
result (eval data)]
(println result)
(recur)))
Здесь вы видите основные части истинной замены. read-line
читает текст с консоли. read-string
преобразует эту строку в данные (списки, векторы, числа и т. Д.). eval
оценивает данные, возвращающие результат, и println
выводит результат.
Некоторые утверждают (и я согласен), что только те системы, которые следуют этим четырем шагам, могут быть названы repl. И некоторые также отметили бы, что Scala не является homoiconic, и поэтому не может по-настоящему иметь repl.
По homoiconic, я имею в виду, что компилятор работает с одними и теми же структурами данных, создаваемыми читателем языка, и управляется основными конструкциями языка. Например, это совершенно правильный код Clojure:
(eval (list (symbol "+") 41 1))) ; evals to 42
Так вот суть дискуссии по поводу «реальных» консолей REPL. Только homoiconic языки, такие как lisp (и, возможно, пролог?), Могут иметь настоящие REPL. Все остальные должны действительно называться «интерактивными переводчиками».
Что касается скорости движения. Вероятно, это связано с сложностью компилятора. Компилятор Clojure составляет всего около 10 тыс. Строк довольно линейного кода. Одиночный проход, ничего особенного. Компилятор Scala довольно продвинутый, поддерживающий такие вещи, как статическая типизация и несколько проходов. Эти дополнительные функции не нужны на языке Clojure, и они, как правило, замедляют работу компилятора.
Хм. Я бы подумал, что если взаимодействие с командной строкой связано с отдельными этапами чтения, оценки и печати, этого будет достаточно для REPL-ness, независимо от того, является ли язык гомоциконным или нет. Я бы не назвал что-то интерпретатором, если он компилируется до его выполнения. Конечно, существуют всевозможные промежуточные случаи между «исполнением одного выражения за раз, один за другим» и «перевод и оптимизация больших фрагментов кода до какого-то« машинного »языка, а затем выполнение». Однако, я не думаю, что это имеет значение! – Mars
Связанные: http://stackoverflow.com/questions/5671214/is-lisp-the-only-language-with-repl –