Bir REPL ve etkileşimli kabuk arasındaki fark


37

Noob sorusu. REPL ile etkileşimli bir kabuk arasındaki farkı sadece Wikipedia'daki tanımları okuyarak söyleyemiyorum .

Wiki, REPL'in belirli bir etkileşimli dil kabuğu olduğunu belirtir. Yine de uygun bir altküme mi var? Wiki tanımı, REPL terminolojisini Lisp benzeri dillerle sınırlıyor gibi gözükse de, belirtilen özellikler gerçekten ayırt edici özellikler içermiyor.

Özellikle, IPython'a bir REPL çağırmak doğru olur mu?

Yanıtlar:


24

REPL: Bu, sadece bir seferde sadece bir komutu kabul eden, çalıştıran ve sonucu basan bir prosedürdür.

Döngünün her yinelemesindeki üç adım:

  1. Klavye giriş arabelleğinden bir metin ifadesi oluşturan karakterleri okumak ve onu temsil etmek için bir veri yapısı oluşturmak için okuma çağırmak,
  2. İfadeyi değerlendirmeye eval denir - sezgisel olarak, eval "ifadenin ne anlama geldiğini bulur" ve "ne yaparsa yapar" ifadesinin değerini döndürür -
  3. Değerlendirmeden elde edilen sonucun yazılı bir sunumunu yapmak için yazma çağrısı yaparak kullanıcının görebilmesi.

Kendi okuma-değerlendirme-baskı döngüsünü kendi programlarınız için yazabilirsiniz, böylece kullanıcılar ifadeler yazabilir ve istediğiniz şekilde yorumlayabilirsiniz. Okuma-değerlendirme-baskı döngüsünü başlatabilirsiniz (yazarak (rep-loop)) ve normal Scheme okuma-değerlendirme-baskı döngüsünden devralacak ve ifadeleri istediğiniz gibi yorumlayacaksınız.

İşte çok basit bir okuma-değerlendirme-baskı döngüsü:

  (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

Her yazma işleminin argümanı gerçek çağrıdan önce hesaplandığından, (write (eval (read))) ifadesinin doğru okuma-değerlendirme-baskı sırasına göre yapıldığına dikkat edin.

Etkileşimli Kabuk: Etkileşimli bir kabuk, terminaldeki kullanıcı girişinden komutları okur. Diğer şeylerin yanı sıra, böyle bir kabuk aktivasyonda başlangıç ​​dosyalarını okur, bir bilgi istemi görüntüler ve varsayılan olarak iş kontrolünü sağlar. Kullanıcı kabukla etkileşime girebilir. Etkileşimli kabuk adının nasıl oluştuğu budur. Bu bash betiğini düşünelim:

     #!/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

Şimdi yukarıdaki komut dosyası kullanıcıyla etkileşime giriyor, kullanıcıdan hesaplamalarını yaptığı girişleri girmesini istiyor. Bu yüzden etkileşimli bir kabuk gibi davranıyor.

Benzer şekilde, çoğu insanın python'u öğrenmek için kullandığı python yorumlayıcısı, kullanıcısı ile iletişim kurduğu için etkileşimlidir.


1
@ The Dark Knight: Yukarıdaki teoriye dayanarak, geliştirici araç çubuğunun (kromda) veya firebug uzantısında (firefox'ta) biraz REPL olduğunu söyleyebilir miyiz?
Rajkishore

9

Teknik olarak, bir kabuğun bir REPL örneği olduğunu söylemek doğrudur. Ancak, yaygın kullanım senaryolarından biri olduğu için program tanımı konusu değildir.

Örneğin, Bash C dilinde yazılmıştır, ancak Python ile de yazılmış olabilir. Bu noktada, programın özellikleri ve yetenekleri hakkında konuşursanız, Python olmasa da Bash'in bir kabuk olduğunu söylemek doğru olur mu?

Ayrıca, REPL'ler çalışan talimatlar ve fonksiyon çağrıları hakkında, Kabukların komut çalıştırma ile ilgili olduğunu da söyleyebilirsiniz. Ancak REPL'lerde komutları (Python'un os.system, os.popen, etc) çalıştıramazsınız ve Bash'deki birçok fonksiyonunu kullanarak fonksiyonlar çalıştıramazsınız (veya tanımlayamazsınız)?

Daha önce de belirtildiği gibi, bu bir kullanım meselesi. Dosyaları ve hazır programları oynatırsanız, bir kabuk olarak kullanıyorsunuzdur. Kütüphaneleri veya dil anlamını test ediyorsanız, bu bir REPL.

Umarım yardımcı olur.


3

Bu StackOverflow sorusu, bu soruyu (diğer şeylerin yanı sıra) tartışır.

Ben şahsen etkileşimli Python ile ilgili olarak çitin üzerindeyim. Ancak, buna REPL demek istiyorsanız, kimsenin size kızacağını sanmıyorum (kaynak kod dosyalarında çalışan çok fazla şey var, ancak etkileşimli kabukta arama yapmaktan tamamen mutlu olmam için bir REPL).


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.