ฉันควรเรียนรู้ภาษาถิ่นใดของ Lisp [ปิด]


91

ฉันรู้ว่ามีภาษาถิ่นที่แตกต่างกันเล็กน้อยของ Lisp หลังจากตัดสินใจว่าการเรียนรู้ Lisp จะเป็นประสบการณ์ทางปัญญาใหม่ฉันอยากรู้ว่าควรเรียนภาษา Lisp ภาษาใดและเพราะเหตุใด

มีอันไหนที่ได้รับความนิยมมากกว่าเจ้าอื่น ๆ ? มีคนใดคนหนึ่งที่ "สมบูรณ์" กว่าเช่นเดียวกับที่มีเอกสารและรองรับดีกว่า อะไรคือข้อดีข้อเสียของภาษาถิ่นนี้?



ฉันได้ค้นหาสิ่งนั้นก่อนที่ฉันจะถามสิ่งนี้ แต่ลักษณะของคำถามพัฒนาขึ้นเมื่อฉันพิมพ์ ฉันจะไม่สร้างล้อใหม่
Humphrey Bogart

คำถามนี้แตกต่างกันอย่างไรกับคำถามที่เกร็กกล่าวถึงข้างต้น?
cjs

2
ฉันคิดว่าสิ่งที่เขาพยายามจะพูดคือ: เมื่อฉันตั้งคำถามในใจครั้งแรกมันแตกต่างอย่างสิ้นเชิงกับคำถามปัจจุบันและการดูคำถามในการค้นหาที่เกี่ยวข้องไม่ได้เปิดเผยสิ่งใดที่ตรงกับสิ่งที่เขาต้องการ ถาม. แต่เมื่อเขาพิมพ์คำถามมันก็เปลี่ยนไปจึงมาถึง SO ในรูปแบบปัจจุบันซึ่งถูกถามก่อนหน้านี้
J. Polfer

คำตอบ:


77

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

  1. โครงการ น่าจะเป็นภาษาถิ่นที่สะอาดที่สุด ไม่ต้องสงสัยเลยว่าทำไมThe Little Schemerจึงแปลจาก LISP เป็น Scheme ข้อกำหนดมาตรฐานโครงการที่ 5 คือR5RSเป็นการศึกษาที่ยอดเยี่ยมในตัวของมันเอง อาจเป็นภาษาและข้อกำหนดของห้องสมุดที่ดีที่สุดที่ฉันเคยอ่านและสั้นที่สุดที่มีเหตุผลครอบคลุม PLT Scheme (ตอนนี้ไม้) แพลตฟอร์มรวมถึงล่ามค่อนข้างดีและคอมไพเลอร์เป็นสิ่งที่ดีสำหรับการเขียนสคริปต์และยังมีเครื่องมือที่มองเห็นบางอย่างที่ทำให้มันยอดเยี่ยมสำหรับการเรียนรู้

  2. เสียงกระเพื่อมธรรมดา อาจเป็นตัวแปรที่พกพาได้และครอบคลุมมากที่สุดนี่เป็นสิ่งที่คุณต้องการมากที่สุดหากคุณต้องการเขียนสิ่งต่างๆเช่นซอฟต์แวร์เชิงพาณิชย์ มาตรฐานกำหนดไลบรารีที่กว้างขวางและอื่น ๆ อีกมากมายที่มีอยู่นอกเหนือจากนั้นก็มีCLOSซึ่งอาจจะสอนคุณเกี่ยวกับ OO ได้มากกว่าภาษา OO ใด ๆ และคอมไพเลอร์บางตัวก็ดีมาก ข้อเสียรวมถึงหูดบางตัวที่ Scheme ไม่มี (เช่นการมีเนมสเปซแยกต่างหากสำหรับตัวแปรที่อ้างถึงฟังก์ชัน) ไม่สะอาดและเรียบง่าย (เช่นเดียวกับสิ่งใดก็ตามที่ต้องมีส่วนขยายและทำให้การประนีประนอมเป็นสิ่งจำเป็น สำหรับแอปพลิเคชันขนาดใหญ่ในโลกแห่งความเป็นจริง) ไม่มีมาโครที่ถูกสุขอนามัยและเน้นการเรียกซ้ำน้อยกว่า Scheme มาก

  3. Clojureสิ่งนี้ทำงานบน JVM ซึ่งอาจทำให้เป็นขาขึ้นสำหรับนักพัฒนา Java มีหูดอยู่สองสามอย่าง (เช่นคุณต้องขอการเพิ่มประสิทธิภาพการโทรหางอย่างชัดเจนแม้ว่าสิ่งนี้อาจเปลี่ยนแปลงได้ในวันหนึ่งหากเพิ่ม TCO ลงใน JVM) แม้ว่ามาโครจะไม่ถูกสุขอนามัย แต่ก็มีคุณสมบัติบางอย่างที่จะช่วยคุณหลีกเลี่ยงการจับตัวแปรดังนั้นคุณจึงสามารถจับตัวแปรได้หากคุณต้องการจริงๆในขณะที่มีความเสี่ยงน้อยกว่าที่จะทำโดยไม่ได้ตั้งใจมากกว่าใน CL คุณสามารถเข้าถึงไลบรารี Java ทั้งหมดได้อย่างง่ายดาย นั่นอาจเป็นสิ่งที่ดีสำหรับโค้ด "โลกแห่งความจริง" และค่อนข้างไม่มีจุดหมายในแง่ของการเรียนรู้ มีชุดของไลบรารีสำหรับโครงสร้างข้อมูลถาวรและรองรับ STM ซึ่งทำให้น่าสนใจมากจากมุมมองที่เกิดขึ้นพร้อมกัน นี่อาจเป็นทางออกที่ดีที่สุดของคุณถ้าคุณ สนใจที่จะเรียนรู้เพิ่มเติมเกี่ยวกับวิธีการใหม่ ๆ ในการจัดการกับการเขียนโปรแกรมพร้อมกันและคู่ขนาน ดูเหมือนว่า Clojure สามารถใช้งานได้กับแอปพลิเคชันที่ใช้งานจริงขนาดใหญ่เช่นเดียวกับ Java ในแง่ที่ว่ามันจะมีความสามารถในการทำ "สิ่งที่น่าเกลียด" ที่คุณทำในแอปที่ใช้งานจริงซึ่งคุณไม่อยากทำและไม่ทำ เมื่อคุณกำลังเรียนรู้

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

อัปเดต 2018

เป็นเวลาเกือบสิบปีแล้วที่ฉันเขียนโพสต์นี้และตระกูลภาษา Lisp ดูเหมือนจะได้รับแรงฉุดอย่างมีนัยสำคัญในจิตสำนึกของโปรแกรมเมอร์ทั่วไป สิ่งนี้ดูเหมือนจะเกี่ยวข้องกับ Clojure ซึ่งไม่เพียง แต่กลายเป็นภาษาถิ่นที่แยกจากกันอย่างถูกต้องของ Lisp ในสิทธิของตัวเองเท่านั้นการนำเสนอแนวคิดดีๆมากมายของตัวเอง แต่ตอนนี้ยังมีเวอร์ชันที่ใกล้เคียงกับ JavaScript ที่กำหนดเป้าหมายและได้สร้างแรงบันดาลใจให้ Lisps อื่น ๆ อีกมากมาย กำหนดเป้าหมายแพลตฟอร์มอื่น ๆ ตัวอย่างเช่นHyกำหนดเป้าหมาย CPython AST และ bytecode โดยมุ่งเป้าไปที่ความสามารถในการทำงานร่วมกันกับ Python ก่อน แต่ใช้แนวคิด Clojure "เมื่อมีข้อสงสัย" (แม้ว่าจากการกระทำครั้งล่าสุดข้อหลังอาจจะเปลี่ยนไปเล็กน้อย)

การเปลี่ยนแปลงครั้งใหญ่ที่นำมาสู่กระบวนการตัดสินใจของคุณคือคุณควรดูว่าภาษาลิสป์หรือภาษาลิสป์ใดที่มีให้ใช้งานและทำงานร่วมกับภาษาหรือแพลตฟอร์มที่คุณใช้อยู่แล้วไม่ว่าจะเป็นPerl , Ruby , Erlang , Goหรือแม้แต่c ++ บนไมโครคอนโทรลเลอร์


3
การมีเนมสเปซแยกกันไม่ใช่หูด แต่เป็นการตัดสินใจในการออกแบบที่แตกต่างกัน โปรดทราบว่ามีเนมสเปซอื่นอยู่แล้วใน Scheme ดังนั้นการอภิปรายจึงค่อนข้างเป็น Lisp-5 กับ Lisp-6 นอกเหนือจากความสะดวกสบายที่ฉันสามารถเรียกรายการ "รายการ" และ "รถ" ใน CL ได้แล้วระบบมาโครของมันยังใช้งานได้จริงและมีประโยชน์มากกว่าเพราะคอมไพเลอร์ไม่ได้สับสนอะไรง่ายๆ
Svante

Clojure ไม่มีการเพิ่มประสิทธิภาพการโทรหางและไม่สามารถทำได้เนื่องจาก JVM bytecode ไม่รองรับ สิ่งที่มีคือรูปแบบพิเศษ "เกิดซ้ำ" ที่เรียกฟังก์ชันปัจจุบันด้วยตนเอง
Svante

3
Curt: ฉันขอยืนยันว่า Clojure เป็นอุปกรณ์พกพามากที่สุดเนื่องจากทำงานบน Java VM
justinhj

1
ฉันไม่รู้เกี่ยวกับเรื่องนั้น หากคุณไม่รวมอุปกรณ์ขนาดเล็กและอุปกรณ์ฝังตัว (เช่นโทรศัพท์และสมาร์ทการ์ด) โดยที่คุณจะไม่ใช้งานโปรแกรมเดสก์ท็อป / เซิร์ฟเวอร์ที่ไม่มีการปรับเปลี่ยนอีกต่อไป elisp จะทำงานบน CPU และแพลตฟอร์มมากกว่า JVM อย่างแน่นอน
cjs

1
ฉันไม่เห็นด้วยอย่างยิ่ง การเรียกซ้ำมีแนวโน้มที่จะสร้างรหัสที่ a) บริสุทธิ์มากขึ้น b) ตรวจสอบได้ง่ายขึ้น c) มีแนวโน้มที่จะถูกต้องมากขึ้น รายละเอียดเพิ่มเติม: a) มีแนวโน้มที่จะสัมผัสกับตัวแปรที่อยู่นอกฟังก์ชันน้อยลง b) การพิสูจน์อุปนัยมีแนวโน้มที่จะหลุดออกจากฟังก์ชันวนซ้ำตามธรรมชาติในขณะที่การวนซ้ำคุณต้องตรวจสอบค่าคงที่ของลูปเป็นต้น; c) ความน่าเชื่อถือมาจาก a) และคุณมักจะถูกผลักไปที่รหัสในลักษณะที่ทำให้คุณทำ (อาจจะไม่เป็นทางการ) ในการพิสูจน์อุปนัยของ b)
cjs

22

ฉันจะบอกว่า Scheme เพียงเพราะLittle Schemerซึ่งเป็นหนังสือที่สนุกที่สุดเล่มหนึ่ง แต่ยากมากที่ฉันเคยพยายามอ่าน


15
อย่าลืม SICP! mitpress.mit.edu/sicp . นี่คือการอ่านแบบคลาสสิก
Joris Timmermans

7
มีสองหรือสามฉบับของThe Little Lisperก่อนที่The Little Schemer จะออกมาเป็นฉบับแปล
cjs


8

นอกจากนี้ Clojure ยังได้รับความสนใจเป็นอย่างมากในทุกวันนี้และด้วยเหตุผลที่ดี โครงสร้างข้อมูลที่ยอดเยี่ยมการรองรับการทำงานพร้อมกันที่ดีอย่างลึกซึ้ง (ทำให้ Scheme และ CL อับอายในเรื่องนี้) และชุมชนที่ยอดเยี่ยม นอกจากนี้ยังค่อนข้างง่าย CL อย่างน้อยก็ซับซ้อนพอ ๆ กับ C ++

นี่ไม่ได้หมายความว่าฉันไม่ชอบ CL หรือ Scheme ฉันเรียนรู้โครงการกับ SICP และ CL พาฉันมาที่ Clojure ทุกอย่างขึ้นอยู่กับเป้าหมายของคุณที่ฉันคิดไว้ หากคุณต้องการเรียนรู้ Lisp ที่ใช้งานได้จริงสำหรับ Clojure ไม่งั้น CL หรือ Scheme ก็ยอดเยี่ยมทั้งคู่


สิ่งนี้ดูเหมือนจะบอกเป็นนัยว่า CL หรือ Scheme ไม่ "ใช้งานได้จริง" ในขณะที่พวกเขาใช้งานได้จริง โดยเฉพาะอย่างยิ่งมาตรฐาน CL เกิดจากการพิจารณาในทางปฏิบัติ
Leslie P. Polzer

2
ภูมิทัศน์ของภาษาการเขียนโปรแกรมเปลี่ยนไปตั้งแต่ปี 1994 ฉันไม่รู้ว่ามาตรฐาน CL จะเปลี่ยนแปลง / พัฒนาอย่างไรเพื่อรองรับสิ่งที่เรียนรู้ตั้งแต่นั้นมา โลกกำลังหมุนไปข้างหน้าและเท่าที่ฉันบอกได้ว่า CL กำลังหยุดนิ่ง ฉันชอบ CL นะ Clojure มีวิธีเข้าใกล้พลังของมัน แต่ฉันไม่เห็นว่า CL จะพัฒนาไปอย่างไร - ถ้าคุณจะใช้ภาษาที่เป็นมาตรฐานต้องมีเส้นทางวิวัฒนาการที่ชัดเจน หากไม่มีภาษาก็ไม่น่าจะเป็นทางเลือกที่ใช้ได้จริง
dnolen

4
CL มีการพัฒนาและพัฒนาผ่านไลบรารีที่มีประโยชน์มากมาย ภาษาพื้นฐานมีพลังมากกว่าในปี 1994 มากกว่าภาษา "สมัยใหม่" ทั้งหมดในปัจจุบัน
Svante

5

ฉันชอบ CL เนื่องจากฉันชอบการเขียนโปรแกรมเชิงวัตถุและ CLOS เป็นระบบวัตถุที่ดีที่สุด


5
เมื่อพูดถึง CL ฉันขอแนะนำ ClozureCL หรือ SBCL ทั้งสองอย่างเป็นโอเพ่นซอร์สเอกสารที่ดีเป็นผู้ใหญ่หลายแพลตฟอร์มและมีฟังก์ชันการทำงานที่ไม่ได้มาตรฐานที่สำคัญเช่นมัลติเธรด
Daniel Dickison

5

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

นี่คือบทความที่น่าสนใจเกี่ยวกับทำไม MIT จึงเปลี่ยนจาก Scheme เป็น Pythonในหลักสูตรการเขียนโปรแกรมเบื้องต้น


3

ฉันจะพูดทั้งหมดอย่างน้อยก็ในตอนแรก ในที่สุดคุณอาจพัฒนาความชอบสำหรับ Scheme หรือ Common Lisp แต่ทั้งคู่มีความแตกต่างกันมากพอที่จะจัดการกับทุกสิ่งที่อยู่ตรงนั้นได้ดีที่สุด

Scheme มีความต่อเนื่องเช่นและเป็นการดีที่จะเรียนรู้เกี่ยวกับสิ่งที่อยู่ใน Scheme แม้ว่าจะสามารถนำไปใช้ใน Common Lisp ได้ก็ตาม

การเรียนรู้ความแตกต่างระหว่างขอบเขตศัพท์และไดนามิกเป็นสิ่งสำคัญและถ้าคุณเรียนรู้ทั้ง Common Lisp และ elisp คุณจะพบกับความหมายของทั้งสองอย่าง


0

LFE (Lisp Flavored Erlang) น่าจะดี คุณสามารถมีไวยากรณ์ lisp ที่ด้านบนของ Erlang VM


0

เป็นคำถามที่ "โหลด" ขึ้นต้นด้วย แต่ OP อาจไม่รู้เกี่ยวกับเรื่องนี้ โดยทั่วไปแล้วเสียงกระเพื่อมของ Common และ Scheme เปรียบเสมือน "คน" ของพีซีและคอมพิวเตอร์ของ Apple ไม่ปะปนกัน อันไหนดีที่สุดอาจไม่เกี่ยวข้องเท่ากับอันไหน "เหมาะกับคุณ" จริงๆไม่ได้มีความแตกต่างกันมากนัก ความพึงพอใจที่มีต่อคนอื่น ๆ อาจได้รับอิทธิพลจากสิ่งที่คุณเรียนรู้ก่อน (สำหรับฉันรายการว่างเปล่าควรเป็น "ไม่มีอะไร" หรือที่รู้จักใน CL ในชื่อ NIL และนั่นทำให้ฉันกลายเป็น Common Lisper) ฉันชอบการรวม SBCL กับ Slime โดยใช้ EMACS แต่ SBCL ไม่ใช่สำหรับทุกคน ประการหนึ่ง SBCL นั้นเข้มงวดมาก หากคุณแค่ต้องการ "สนุก" GNU clisp นั้นง่ายและพร้อมใช้งานสำหรับแทบทุกแพลตฟอร์ม

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