S- นิพจน์อ่านได้


9

โดยสรุปและสำหรับผู้ที่ไม่ทราบว่าฟังก์ชั่นเสียงกระเพื่อม / ผู้ประกอบการ / การสร้างทั้งหมดเรียกว่าเหมือนกันนี้:

(function arg0 arg1 ... argN)

ดังนั้นในภาษา C เหมือนคุณจะแสดงออกเป็น

if (a > b && foo(param))

ถูกแปลงเป็น Lisp sexp เช่น

(if (and (> a b) (foo param)))

. ในขณะที่สิ่งต่าง ๆ มีความซับซ้อนและซับซ้อนมากขึ้นจริง ๆ ฉันจึงใช้คำพูดที่สอดคล้องกันสำหรับฉัน

ฉันรู้ว่านี่อาจเป็นคำถามส่วนตัว แต่ - สำหรับแฮ็กเกอร์ LISP หลายคนแล้วสิ่งนี้จะสร้างความรำคาญเล็กน้อยให้กับคุณเสมอ

หรือคนส่วนใหญ่คุ้นเคยกับไวยากรณ์ (ขาด) ไม่ช้าก็เร็ว?

ไม่ว่าในกรณีใดการเพิ่ม breaklines (ซึ่งคุณจะไม่เพิ่มในค่าเทียบเท่า C ของคุณส่วนใหญ่) เพื่อให้สามารถอ่านเป็นความคิดที่ดีโดยเฉพาะในระยะยาวหรือไม่ ข้อเสนอแนะอื่น ๆ จะได้รับการต้อนรับ


1
คุณเคยลองใช้ Lisp ในสภาพแวดล้อม Lisp ที่รับรู้อย่าง emacs หรือไม่? ฉันจะไม่สัมผัสมันด้วยวิธีอื่น
David Thornley

ไม่ฉันไม่สามารถปรับปรุงประสบการณ์เสียงกระเพื่อมได้ในรูปแบบใด
vemv

การเขียนฟังก์ชั่นสั้น ๆ ก็มีความสำคัญเช่นกันถึงแม้ว่าฉันจะเล่นด้วย clojure เท่านั้น
Kevin

3
ในสภาพแวดล้อมเสียงกระเพื่อมที่ดีคุณจะไม่สนใจวงเล็บและอ่านโครงสร้างโดยการเยื้อง อย่างที่คุณสังเกตเห็นการอ่านโครงสร้างโดยการนับวงเล็บนั้นน่ารำคาญจริงๆ
David Thornley

คำตอบ:


8

คุณแยกวิเคราะห์ได้อย่างไร

if (a > b && foo(param)) {
  doSomething();
} else {
  doSomethingElse();
}

ต้นไม้แยกอาจดูเหมือนอะไร

if:
  condition:
    and:
      lt:
        left: a
        right: b
      function:
        name: foo
        param: param
  true-block:
    function:
      name: doSomething
  false-block:
    function:
      name: doSomethingElse

อืม ... มาเรียงลำดับต้นไม้นี้เป็นรายการ

if(and(<(a, b), function(foo, param)), function(doSomething), function(doSomethingElse))

รูปแบบการแยกวิเคราะห์ต้นไม้นี้จัดการได้ง่าย แต่ฉันมีปัญหาหนึ่ง ฉันเกลียดคั่น ฉันชอบเทอร์มินัล ในเวลาเดียวกันฉันชอบโรยในช่องว่าง

if( and (<(a b) function(foo param)) function (doSomething) function ( doSomethingElse))

อืม ... ช่องว่างเพิ่มเติมทำให้บางสิ่งยากขึ้นในการแยกวิเคราะห์ ... บางทีฉันอาจสร้างกฎที่ต้นไม้แทน (ใบลีบใบ)

(if (and (< a b) (function foo param)) (function doSomething) (function doSomethineElse)

ทีนี้การทำให้เป็นอันดับของต้นไม้แยกเป็น lisp (เปลี่ยนชื่อฟังก์ชั่นที่จะใช้และสิ่งนี้อาจทำงาน) ถ้าฉันต้องการโปรแกรมที่เขียนโปรแกรมมันเป็นเรื่องดีที่จะจัดการต้นไม้แยก

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

แต่อย่างที่เดวิดพูดให้ใช้เครื่องมือแก้ไขการแสดงออกแบบนิพจน์ คุณมีแนวโน้มที่จะสูญเสียการติดตามการปิดวงเล็บในนิพจน์ s มากกว่าการปิดวงเล็บใน xml ( </foo>ปิดเท่านั้น<foo>แต่การปิดวงเล็บขวาปิดการแสดงออกใด ๆ ) ในแร็กเก็ตการใช้วงเล็บเหลี่ยมสำหรับการแสดงออกบางอย่างควบคู่ไปกับสไตล์การเยื้องที่ดีแก้ไขปัญหาส่วนใหญ่

รุ่นเสียงกระเพื่อม:

(if (and (< a b) (foo param))
  (doSomething)
  (doSomethingElse))

ก็ไม่เลวนะ.


รายการมีความหลากหลายและมีประสิทธิภาพมากกว่าคำสั่ง exprs + อย่างไม่ต้องสงสัย การลองใช้ Emacs (หรืออะไรอย่างอื่น) กำลังดึงดูด แต่ครั้งล่าสุดที่ฉันลองทำมันทำให้ฉันกลัวมาก การรับรู้ sexp นำมาซึ่งอะไรกันแน่?
vemv

สิ่งที่ง่าย: พวกเขาเด้งเน้นที่ปิดและเปิด parens (หรือเน้นทั้งการแสดงออก s แตกต่างกัน) พวกเขามีกฎเยื้องที่ดี Emacs มีสิ่งอื่น ๆ แต่อาจไม่สำคัญสำหรับการอ่าน มีบรรณาธิการที่ทราบ s-expression อื่น ๆ อยู่ คุณไม่ต้องการ emacs หาก emacs ทำให้คุณกลัวลองใช้ชุดข้อความสำหรับข้อความย่อยประเสริฐ ฯลฯ เมื่อบรรณาธิการของคุณเริ่มช่วยในการอ่านสิ่งต่าง ๆ จะกลายเป็นเรื่องง่ายขึ้นเล็กน้อย ฉันทำสิ่งที่เงียบที่สุดในแร็กเก็ตซึ่งอนุญาตให้วงเล็บเหลี่ยมสามารถใช้ parens ได้ทุกที่ ความสามารถในการสลับช่วยให้อ่านง่าย
ccoakley

1
ให้ใช้ประโยชน์จากการซ้อนกันกำหนด ฯลฯ แยกสิ่งนั้นออกเป็นชิ้นเล็ก ๆ หากคุณไม่สามารถสร้างชื่ออันดีให้กับชิ้นส่วนได้ให้ถือว่าเป็นคำเตือนเกี่ยวกับการออกแบบของคุณ ค้นหาความสมดุลระหว่างขนาดเล็กเกินไปที่จะชื่อและใหญ่เกินไปที่จะอ่าน
ccoakley

โอ้คำแนะนำสุดท้ายคือ ... จดจำ :) ลอง Sublime ขณะที่ฉันกำลังเขียนนี้
vemv

5

สิ่งที่ดีจริงๆเกี่ยวกับ s-exp คือหลังจากผ่านไปไม่นานคุณจะไม่เห็นพวกเขาอีกต่อไปมันก็เหมือนกับงูหลามต่อตาแต่คอมพิวเตอร์ก็ยังมีต้นไม้ได้ง่าย

  • การเยื้องจึงเป็นไปโดยอัตโนมัติไม่มีความกำกวมคุณไม่จำเป็นต้องกดแท็บสองครั้งหรือทำอย่างนั้นเมื่อคุณต้องการวางบล็อก

  • หากคุณเลือกรหัสแบบสุ่มบางสิ่งทั้งหมดจะถูกเยื้องอย่างง่ายดายด้วยคำสั่งเดียวจากโปรแกรมแก้ไขที่คุณโปรดปราน

  • คุณสามารถนำทางผ่านรหัสของคุณจริงๆได้อย่างง่ายดายกระโดดระหว่าง S-EXP, แลกเปลี่ยนพวกเขาและอื่น ๆ ที่มีแก้ไขที่ดี

นอกจากนี้เนื่องจากข้อมูลที่คุณกำลังจัดการนั้นเหมือนกับรหัสที่คุณเขียนคุณสามารถใช้ภาษาเดียวกันเพื่อจัดการรหัสของคุณใช่ไหม

ดีคุณสามารถทำได้นั่นคือมาโครคุณจัดการโค้ดที่คุณเขียนก่อนที่จะถูกประเมินเหมือนรายการอื่น ๆ นั่นคือเหตุผลที่ว่ากันว่า Lisp เป็น "ภาษาโปรแกรมที่ตั้งโปรแกรมได้" คุณเขียนโค้ดที่เขียนโค้ดให้คุณ

นี่เป็นบทความที่ดีที่อธิบายลักษณะของ Lisp และเหตุใดโปรแกรมเมอร์ Lisp จึงยิ้มเมื่อเห็น XML

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