REPL: это процедура, которая просто зацикливается, принимает по одной команде за раз, выполняет ее и печатает результат.
Три шага на каждой итерации цикла:
- Вызов read для чтения символов, составляющих текстовое выражение, из буфера ввода с клавиатуры и построения структуры данных для ее представления.
- Вызов eval для оценки выражения - интуитивно, eval «выясняет, что означает выражение» и «делает то, что говорит», возвращая значение выражения - и
- Вызов 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, является интерактивным, поскольку он общается со своим пользователем.
Технически, правильно сказать, что оболочка является экземпляром REPL. Однако это не вопрос определения программы, поскольку это один из распространенных сценариев использования.
Bash, например, написан на C, но вполне мог быть написан на Python. На этом этапе, если вы говорите о возможностях и возможностях программы, было бы правильно сказать, что Bash - это оболочка, а Python - нет?
Можно также сказать, что оболочки - это команды, а команды REPL - инструкции и вызовы функций. Но разве вы не можете запускать команды в REPL (os.system в Python, os.popen и т. Д.), И вы не можете запускать (или определять) функции в Bash, используя многие из его встроенных функций?
Как сказано выше, это вопрос использования. Если вы манипулируете файлами и готовыми программами, вы используете его как оболочку. Если вы тестируете библиотеки или семантику языка, это REPL.
Надеюсь, это поможет.
источник
Этот вопрос StackOverflow обсуждает этот вопрос (помимо прочего).
Я лично нахожусь на заборе в отношении интерактивного Python. Но, если вы хотите назвать это REPL, я не думаю, что кто-то будет сердиться на вас (в файлах исходного кода слишком много вещей, которые работают, но не в интерактивной оболочке, чтобы я был полностью доволен вызовом это ответ).
источник