Разница между REPL и интерактивной оболочкой


37

Нуб вопрос. Я не совсем могу отличить REPL от интерактивной оболочки, просто прочитав определения в Википедии.

Wiki отмечает, что REPL - это особый вид интерактивной языковой оболочки. Это правильное подмножество, хотя? Похоже, что определение Wiki ограничивает терминологию REPL языками, подобными Lisp, тогда как указанные свойства на самом деле не содержат никаких отличительных признаков.

В частности, было бы правильно назвать IPython REPL?

Ответы:


24

REPL: это процедура, которая просто зацикливается, принимает по одной команде за раз, выполняет ее и печатает результат.

Три шага на каждой итерации цикла:

  1. Вызов read для чтения символов, составляющих текстовое выражение, из буфера ввода с клавиатуры и построения структуры данных для ее представления.
  2. Вызов eval для оценки выражения - интуитивно, eval «выясняет, что означает выражение» и «делает то, что говорит», возвращая значение выражения - и
  3. Вызов write для печати текстового представления результата eval, чтобы пользователь мог его увидеть.

Вы можете написать свой собственный цикл read-eval-print для своих собственных программ, чтобы пользователи могли вводить выражения, и вы могли интерпретировать их любым удобным для вас способом. Вы можете запустить свой цикл read-eval-print (введя (rep-loop)), и он заменит обычный цикл Scheme read-eval-print, интерпретируя выражения по-своему.

Вот очень простой цикл read-eval-print:

  (define (rep-loop)
  (display "repl>")      ; print a prompt
  (write (eval (read)))  ; read expr., pass to eval, write result
  (rep-loop))            ; loop (tail-recursive call) to do it again

Обратите внимание, что выражение (write (eval (read))) выполняет действия в правильном порядке read-eval-print, поскольку аргумент для каждого вызова процедуры вычисляется до фактического вызова.

Интерактивная оболочка: интерактивная оболочка считывает команды из пользовательского ввода на терминале. Среди прочего, такая оболочка читает файлы запуска при активации, отображает приглашение и по умолчанию включает управление заданиями. Пользователь может взаимодействовать с оболочкой. Так появилось имя интерактивной оболочки. Давайте рассмотрим этот скрипт bash:

     #!/bin/bash
     echo -n "Enter the value of variable 'var1': "
     read var1
     echo "var1 = $var1"
     echo

    echo -n "Enter the values of variables 'var2' and 'var3' "
    echo =n "(separated by a space or tab): "
    read var2 var3
    echo "var2 = $var2      var3 = $var3"
    #  If you input only one value,
    #+ the other variable(s) will remain unset (null).

    exit 0

Теперь вышеприведенный скрипт взаимодействует с пользователем, он просит пользователя ввести входные данные, на основании которых он выполняет свои вычисления. Вот почему он ведет себя как интерактивная оболочка.

Similary, интерпретатор python, который большинство людей использует для изучения python, является интерактивным, поскольку он общается со своим пользователем.


1
@The Dark Knight: Итак, основываясь на приведенной выше теории, можем ли мы сказать, что панель инструментов разработчика (в Chrome) или расширение Firebug (в Firefox) является своего рода REPL?
Раджкишор

9

Технически, правильно сказать, что оболочка является экземпляром REPL. Однако это не вопрос определения программы, поскольку это один из распространенных сценариев использования.

Bash, например, написан на C, но вполне мог быть написан на Python. На этом этапе, если вы говорите о возможностях и возможностях программы, было бы правильно сказать, что Bash - это оболочка, а Python - нет?

Можно также сказать, что оболочки - это команды, а команды REPL - инструкции и вызовы функций. Но разве вы не можете запускать команды в REPL (os.system в Python, os.popen и т. Д.), И вы не можете запускать (или определять) функции в Bash, используя многие из его встроенных функций?

Как сказано выше, это вопрос использования. Если вы манипулируете файлами и готовыми программами, вы используете его как оболочку. Если вы тестируете библиотеки или семантику языка, это REPL.

Надеюсь, это поможет.


3

Этот вопрос StackOverflow обсуждает этот вопрос (помимо прочего).

Я лично нахожусь на заборе в отношении интерактивного Python. Но, если вы хотите назвать это REPL, я не думаю, что кто-то будет сердиться на вас (в файлах исходного кода слишком много вещей, которые работают, но не в интерактивной оболочке, чтобы я был полностью доволен вызовом это ответ).


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.