ความแตกต่างระหว่าง REPL และเชลล์แบบโต้ตอบ


37

Noob คำถาม ฉันไม่สามารถบอกความแตกต่างระหว่างREPLและเชลล์เชิงโต้ตอบได้โดยการอ่านคำจำกัดความบน Wikipedia

Wiki ตั้งข้อสังเกตว่า REPL เป็นเชลล์แบบโต้ตอบชนิดหนึ่งโดยเฉพาะ มันเป็นเซตย่อยที่เหมาะสมหรือไม่? คำจำกัดความของ Wiki ดูเหมือนว่าจะ จำกัด คำศัพท์ REPL เป็นภาษาที่เหมือนเสียงกระเพื่อมในขณะที่คุณสมบัติที่ระบุไม่ได้มีคุณสมบัติที่แตกต่างกันจริงๆ

โดยเฉพาะอย่างยิ่งมันถูกต้องหรือไม่ที่จะโทรหา IPython a REPL?

คำตอบ:


24

REPL:นี่เป็นโพรซีเดอร์ที่เพิ่งวนรอบยอมรับคำสั่งทีละครั้งเรียกใช้งานและพิมพ์ผลลัพธ์

สามขั้นตอนในการวนซ้ำแต่ละครั้งของลูปคือ:

  1. การเรียกอ่านเพื่ออ่านอักขระที่ประกอบขึ้นเป็นนิพจน์ทางข้อความจากบัฟเฟอร์อินพุตคีย์บอร์ดและสร้างโครงสร้างข้อมูลเพื่อแทนค่า
  2. การเรียกใช้ eval เพื่อประเมินค่านิพจน์ - อย่างสังหรณ์ใจ eval "หาว่านิพจน์หมายถึงอะไร" และ "ทำสิ่งที่มันบอกให้ทำ" คืนค่าของนิพจน์ - และ
  3. การเรียกเขียนเพื่อพิมพ์การแสดงข้อความต้นฉบับของผลลัพธ์จาก eval เพื่อให้ผู้ใช้สามารถเห็นได้

คุณสามารถเขียนวนรอบ read-eval-print ของคุณเองสำหรับโปรแกรมของคุณเพื่อให้ผู้ใช้สามารถพิมพ์ในนิพจน์และคุณสามารถตีความพวกเขาในแบบที่คุณต้องการ คุณสามารถเริ่มลูป read-eval-print (โดยการพิมพ์ (rep-loop)) และมันจะเข้ามาแทนที่จากลูป read-eval-loop แบบแผนโครงการปกติแปลความหมายของนิพจน์ในแบบของคุณ

นี่คือลูป 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

ขอให้สังเกตว่านิพจน์ (เขียน (eval (อ่าน))) ทำสิ่งต่าง ๆ ในลำดับการอ่าน - Eval-print ที่เหมาะสมเนื่องจากอาร์กิวเมนต์ของการเรียกแต่ละโพรซีเดอร์ถูกคำนวณก่อนการโทรจริง

Interactive Shell: เชลล์แบบโต้ตอบอ่านคำสั่งจากอินพุตของผู้ใช้บนเทอร์มินัล เหนือสิ่งอื่นใดเช่นเชลล์อ่านไฟล์เริ่มต้นเมื่อเปิดใช้งานแสดงพรอมต์และเปิดใช้งานการควบคุมงานโดยค่าเริ่มต้น ผู้ใช้สามารถโต้ตอบกับเชลล์นั่นคือวิธีที่ชื่อเชลล์แบบโต้ตอบเกิดขึ้น ให้เราพิจารณาสคริปต์ทุบตีนี้:

     #!/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 ซึ่งเป็นล่ามหลามที่คนส่วนใหญ่ใช้เพื่อเรียนรู้หลามเป็นหนึ่งในการโต้ตอบที่มันสื่อสารกับผู้ใช้ของมัน


1
@ The Dark Knight: ดังนั้นตามทฤษฎีข้างต้นเราสามารถพูดได้หรือไม่ว่าแถบเครื่องมือผู้พัฒนา (ใน chrome) หรือส่วนขยาย firebug (ใน firefox) เป็น kinda REPL?
Rajkishore

9

ในทางเทคนิคมันถูกต้องที่จะบอกว่าเชลล์เป็นตัวอย่างของ REPL อย่างไรก็ตามมันไม่ได้เป็นเรื่องของการกำหนดโปรแกรมเพราะมันเป็นหนึ่งในสถานการณ์การใช้งานทั่วไป

ตัวอย่างเช่น Bash เขียนด้วยภาษา C แต่สามารถเขียนด้วยภาษา Python ได้เป็นอย่างดี ณ จุดนั้นถ้าคุณพูดถึงคุณสมบัติและความสามารถของโปรแกรมมันจะถูกต้องหรือไม่ที่จะบอกว่า Bash เป็นเชลล์ในขณะที่ Python ไม่ได้เป็นเช่นนั้น?

คุณสามารถพูดได้ว่า Shells นั้นเกี่ยวกับการเรียกใช้คำสั่งในขณะที่ REPL นั้นเกี่ยวกับการรันคำสั่งและการเรียกใช้ฟังก์ชัน แต่คุณไม่สามารถเรียกใช้คำสั่งใน REPLs (Python os.system, os.popen ฯลฯ ) และคุณไม่สามารถเรียกใช้ฟังก์ชัน (หรือกำหนด) ใน Bash โดยใช้บิวด์อินมากมาย

ดังกล่าวเป็นเรื่องของการใช้งาน หากคุณเล่นปาหี่ไฟล์และโปรแกรมสำเร็จรูปคุณจะใช้มันเป็นเชลล์ หากคุณกำลังทดสอบไลบรารีหรือซีแมนทิกส์ภาษามันคือ REPL

หวังว่าจะช่วย


3

คำถามStackOverflow นี้กล่าวถึงคำถามที่มาก (เหนือสิ่งอื่นใด)

ฉันอยู่บนรั้วเป็นการส่วนตัวเกี่ยวกับ Python แบบโต้ตอบ แต่ถ้าคุณต้องการเรียกมันว่า REPL ฉันไม่คิดว่าจะมีใครโกรธคุณ (มีหลายสิ่งมากเกินไปที่ทำงานในไฟล์ซอร์สโค้ด แต่ไม่มีในเชลล์แบบโต้ตอบเพื่อให้ฉันมีความสุขอย่างสมบูรณ์กับการโทร มันเป็น REPL)


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.