REPL: Jest to procedura, która po prostu zapętla, akceptuje jedno polecenie na raz, wykonuje je i drukuje wynik.
Trzy kroki przy każdej iteracji pętli to:
- Wywołanie read w celu odczytania znaków składających się na wyrażenie tekstowe z bufora wejściowego klawiatury i zbudowanie struktury danych do jej reprezentowania,
- Wywołanie eval w celu oceny wyrażenia - intuicyjnie, eval „odkrywa, co to znaczy wyrażenie” i „robi to, co mówi, aby zrobić”, zwracając wartość wyrażenia - i
- Wywołanie write, aby wydrukować tekstową reprezentację wynikową z eval, aby użytkownik mógł ją zobaczyć.
Możesz napisać własną pętlę read-eval-print dla własnych programów, aby użytkownicy mogli pisać wyrażenia i interpretować je w dowolny sposób. Możesz uruchomić pętlę read-eval-print (wpisując (rep-loop)), a ona przejmie normalną pętlę read-eval-print Schematu, interpretując wyrażenia na swój sposób.
Oto bardzo prosta pętla 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
Zauważ, że wyrażenie (write (eval (read))) działa we właściwej kolejności odczytu-eval-print, ponieważ argument do każdego wywołania procedury jest obliczany przed faktycznym wywołaniem.
Interaktywna powłoka: interaktywna powłoka odczytuje polecenia z danych wprowadzanych przez użytkownika na terminalu. Między innymi taka powłoka odczytuje pliki startowe podczas aktywacji, wyświetla monit i domyślnie włącza kontrolę zadań. Użytkownik może wchodzić w interakcje z powłoką. Tak powstała interaktywna nazwa powłoki. Rozważmy ten skrypt 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
Teraz powyższy skrypt współdziała z użytkownikiem, prosi użytkownika o wprowadzenie danych wejściowych, na podstawie których wykonuje swoje obliczenia. Dlatego zachowuje się jak interaktywna powłoka.
Podobnie interpreter języka Python, którego większość ludzi używa do nauki języka Python, jest interaktywny, ponieważ komunikuje się z użytkownikiem.
Technicznie poprawne jest stwierdzenie, że powłoka jest instancją REPL. Nie jest to jednak kwestia definicji programu, ponieważ jest to jeden z typowych scenariuszy użytkowania.
Bash, na przykład, jest napisany w C, ale równie dobrze mógłby być napisany w Pythonie. Czy w tym momencie, jeśli mówisz o funkcjach i zdolnościach programu, czy poprawne byłoby stwierdzenie, że Bash jest powłoką, podczas gdy Python nie?
Można również powiedzieć, że powłoki dotyczą uruchamiania poleceń, podczas gdy REPL dotyczą uruchamiania instrukcji i wywołań funkcji. Ale czy nie możesz uruchamiać poleceń w REPL (os.system Pythona, os.popen itp.) I nie możesz uruchamiać (lub definiować) funkcji w Bash, używając wielu jego wbudowanych funkcji?
Jak już wspomniano, jest to kwestia użytkowania. Jeśli żonglujesz plikami i gotowymi programami, używasz ich jako powłoki. Jeśli testujesz biblioteki lub semantykę języka, jest to REPL.
Mam nadzieję, że to pomaga.
źródło
To pytanie StackOverflow omawia to samo pytanie (między innymi).
Jestem osobiście na ogrodzeniu, jeśli chodzi o interaktywny Python. Ale jeśli chcesz nazwać to REPL, nie sądzę, że ktoś będzie na ciebie zły (w plikach kodu źródłowego działa nieco za dużo rzeczy, ale nie w interaktywnej powłoce, abym był całkowicie zadowolony z dzwonienia to REPL).
źródło