ทำไม Lisp จึงมีประโยชน์ [ปิด]


64

เห็นได้ชัดว่าLispเป็นข้อได้เปรียบสำหรับสิ่งของAIแต่ไม่ปรากฏว่าฉัน Lisp เร็วกว่า Java, C # หรือ C แม้ว่าฉันไม่ใช่เจ้านายของ Lisp แต่ฉันพบว่ามันยากที่จะเข้าใจข้อดี หนึ่งจะได้รับในการเขียนซอฟต์แวร์ธุรกิจใน Lisp

กระนั้นก็ถือว่าเป็นภาษาของแฮ็กเกอร์

ทำไมPaul Graham จึงสนับสนุน Lisp เหตุใดซอฟต์แวร์ ITAจึงเลือกเสียงกระเพื่อมเหนือภาษาระดับสูงอื่น ๆ มันมีคุณค่าอะไรในภาษาเหล่านี้?


20
บรรทัด "ฉันไม่คิดว่า Lisp เร็วกว่า Java, C # หรือแท้ที่จริงแล้วเร็วกว่า C" ค่อนข้างสับสน โดยทั่วไปแล้ว C นั้นถือเป็นมาตรฐานสำหรับ "รหัสที่รวดเร็วเพราะคุณกำลังเขียนโปรแกรมใกล้กับโลหะ" - เป็นมาตรฐานที่จะเอาชนะทุกสิ่งได้ ตอนนี้ Java และภาษา GC'd อื่น ๆ สามารถเอาชนะได้ในบางบริบทเช่นความเร็วของการจัดสรร / ล้างหน่วยความจำ แต่ประโยคนี้ดูเหมือนว่าจะย้อนกลับไปเล็กน้อย
Michael H.

2
เสียงกระเพื่อมเป็นภาษาระดับสูงกว่าภาษาที่คุณพูดถึงดังนั้นโดยทั่วไปจะช้ากว่า
segfault

5
@Bo Tian: "ภาษาระดับสูงกว่า" ต้องมีคำจำกัดความที่ชัดเจน แม้ว่ามันจะมีอันใดอันหนึ่ง แต่ฟังดูเหมือนไม่เป็นเรื่อง (ขอบคุณ @Mark)
Mike Dunlavey

5
@BoTian "ระดับที่สูงกว่า" ไม่เท่ากับ "ช้าลง" เป็นค่าเริ่มต้น

24
เสียงกระเพื่อมอยู่เพื่อแสดงให้เห็นว่าผิดพลาดนักออกแบบภาษาอื่น ๆ ทุกคนได้รับ

คำตอบ:


78

มีเหตุผลสองสามข้อที่ฉันพยายามพัฒนาให้เป็น Common Lisp

  1. รหัส homoiconic สิ่งนี้อนุญาตให้ใช้โค้ดแก้ไขตัวเองที่มีโครงสร้าง
  2. มาโครที่รับรู้ไวยากรณ์ อนุญาตให้เขียนโค้ดสำเร็จรูปได้อีกครั้ง
  3. ปฏิบัตินิยม Common Lisp ถูกออกแบบมาเพื่อให้งานเสร็จโดยมืออาชีพที่ทำงาน ภาษาที่ใช้งานได้ส่วนใหญ่ไม่ได้เป็นกฎ
  4. มีความยืดหยุ่น มันสามารถทำสิ่งต่าง ๆ มากมายด้วยความเร็วที่สมเหตุสมผล
  5. Wartiness โลกแห่งความจริงคือยุ่ง การเข้ารหัสในทางปฏิบัติทำให้ต้องใช้หรือสร้างโครงสร้างที่ยุ่งเหยิง เสียงกระเพื่อมสามัญมี wartiness เพียงพอที่จะสามารถทำสิ่งต่าง ๆ

เหตุผลที่แท้จริงเพียงเหตุผลเดียวในการเลือกเทียบกับ Common LISP คือไลบรารีมาตรฐานมีวันที่

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


8
ไวยากรณ์อาจเป็นปัญหาหากมีผลกระทบอย่างมากต่อความสามารถในการอ่านหรือการเขียนได้ ฉันไม่คิดว่าเป็นกรณีของ Lisp ตัวแก้ไขที่ดีหรือ IDE สามารถทำไฮไลต์ไวยากรณ์ได้ดีพอสมควรและจับคู่การจับคู่เพื่อไม่ใช่เรื่องใหญ่
Matt Olenik

4
นอกจากนี้ฉันใช้ Lisp เพียงเล็กน้อย (Common LISP) และความรู้สึกทั่วไปที่ฉันได้รับคือ # 2 เป็นประโยชน์ที่ใหญ่ที่สุดสำหรับ Lisp บางทีฉันอาจกำลังคิดอยู่ในกระบวนทัศน์ที่ผิด แต่ฉันไม่คิดว่าฉันเคยมีสถานการณ์ที่จำเป็นต้องแก้ไขรหัสด้วยตนเอง หากคุณมีเหตุผลที่เฉพาะเจาะจงที่จะใช้มันใช่แล้ว แต่อย่างอื่นมาโครดูเหมือนจะเป็นคุณสมบัตินักฆ่าที่แท้จริง แก้ไข: เพิ่งรู้ว่าสิ่งเหล่านี้เป็นคุณสมบัติเดียวกัน
Matt Olenik

3
@Matt: ใช่ FWIW ฉันเพิ่งพบเจอ Nemerle ซึ่งเป็นภาษาทดลอง CR -ish CLR พร้อมมาโคร nemerle.org ฉันคิดว่ามันคุ้มค่าที่จะพูดถึงในบางครั้ง
พอลนาธาน

2
"การปฏิบัตินิยม CL ถูกออกแบบมาเพื่อให้ทำงานโดยมืออาชีพภาษาที่ใช้งานได้ส่วนใหญ่ไม่ได้เป็นกฎ": ฉันไม่เห็นด้วยกับข้อความนี้ ฉันสนใจใน LISP มากและพยายามที่จะอุทิศเวลาในการเรียนรู้ แต่ฉันพบว่าภาษา FP อื่น ๆ มีประสิทธิภาพมากในการ "ทำสิ่งต่าง ๆ ให้สำเร็จ" อย่างน้อยนี่ก็เป็นประสบการณ์ของฉันกับ Scala และ Haskell จนถึงตอนนี้
Giorgio

1
"CL ออกแบบมาเพื่อทำงานให้เสร็จโดยมืออาชีพภาษาการทำงานส่วนใหญ่ไม่ได้เป็นกฎ": คุณช่วยอธิบายเรื่องนี้ได้ไหม? โดยเฉพาะในส่วนที่สองของประโยค คุณช่วยบอกชื่อตัวอย่างได้ไหม?
Giorgio

23

ฉันชอบเสียงกระเพื่อมของมัน

  • วิธีการรวมที่เรียบง่ายและสง่างามในการแสดงรหัสและข้อมูล
  • มุมมองที่เป็นเอกลักษณ์ซึ่งให้คะแนนโบนัส IQ 80 คะแนนที่สำคัญในการแก้ปัญหาที่ยาก (พร้อมปลายหมวกถึง Alan Kay)
  • สภาพแวดล้อมการพัฒนาแบบโต้ตอบและสนทนา
  • พลังที่ไม่เคยมีมาก่อนในการสร้างและจัดการกับ abstractions

การเขียนโปรแกรมคือการต่อสู้ที่ซับซ้อน Abstractions เป็นเครื่องมือที่มีประสิทธิภาพเพียงอย่างเดียวสำหรับการต่อสู้ที่เพิ่มความซับซ้อน (ด้วยขนาดกะโหลกที่ จำกัด และคงที่ของเรา) การจัดการ abstractions ด้วย Lisp เปรียบเสมือนการมีมารที่มีความปรารถนา n + 1


5
+1 สำหรับ "การเขียนโปรแกรมกำลังต่อสู้กับความซับซ้อน Abstractions เป็นเครื่องมือที่มีประสิทธิภาพเพียงอย่างเดียวสำหรับการต่อสู้ที่เพิ่มความซับซ้อนขึ้นเรื่อย ๆ (ฉันหวังว่าฉันจะให้ 10.)
Giorgio

สภาพแวดล้อมการพัฒนาแบบว่องไวโต้ตอบและการสนทนาคืออะไร?
QED

6
ไม่ควรจะเป็น(+ 1 n)ความปรารถนาหรือการปฏิบัติจริงที่ดียิ่งขึ้น(incf n)?
Reb.Cabin

21

ฉันเชื่อว่าคำตอบเสียงกระเพื่อมที่ถูกต้องคือ gnomic มากกว่า บางสิ่งเช่น: "ถ้าคุณต้องถามว่าคุณยังไม่พร้อม"

ถ้าใครถามคำถามเพิ่มเติมคำตอบที่ถูกต้องก็คือ"ใช่"ถ้าเป็นคำถาม / หรือคำถามหรือ"คุณยังไม่พร้อม"


5
Paul Graham พูด Louis Armstrong:“ ถ้าคุณต้องถามว่าแจ๊สคืออะไรคุณจะไม่มีทางรู้”
Jason Baker

25
+1 แม้ว่าบางครั้งวลีเช่น "ถ้าคุณต้องถามคุณยังไม่พร้อม" ทำให้ฉันคิดว่าคนที่พูดอย่างนั้นก็ไม่สามารถอธิบายได้
superM

5
@superM Lisp และฟังก์ชั่นคล้ายกับ Lisp มีคุณสมบัติที่เมื่อมีคนเรียนรู้พวกเขาจะไม่สามารถอธิบายได้อีกต่อไป!
esoterik

18

ฉันคิดว่าข้อดีของเสียงกระเพื่อมในฟิลด์ปัญญาประดิษฐ์ (AI) ที่ทุกคนกล่าวถึงเป็นอุบัติเหตุทางประวัติศาสตร์ ... Lisp เริ่มต้นสำหรับ / ใน AI แต่เป็นภาษาที่ใช้งานทั่วไป

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

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

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

ฉันจะจบด้วยการวิพากษ์วิจารณ์เกี่ยวกับซอฟต์แวร์ธุรกิจ:

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

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


7
ลอง clojure มันเป็นเสียงกระเพื่อมบน JVM ดังนั้นโดยใช้ JVM คุณสามารถใช้ทุกสิ่งจาวา
Zachary K

@zachary: มีการใช้งาน Common LISP อย่างน้อย 2 รายการใน JVM ABCL ค่อนข้างเป็นผู้ใหญ่
Larry Coleman

Clojure รองรับ Java ได้ 100% (อย่างน้อยฉันไม่เคยพบอะไรใน Java ที่ Clojure ไม่สามารถปรับปรุงได้และในแบบที่ Javaists ไม่สามารถบ่นได้) Clojure ได้รับอิทธิพลอย่างมากจาก Common LISP และ FP ที่ดีที่สุด ด้วยสิ่งนี้และ SBCL และ CLisp และ Emacs Lisper คนใดควรรู้สึกเหมือนเป็นกษัตริย์ในปัจจุบัน
Reb.Cabin

13

ฉันไม่ชอบเสียงกระเพื่อม

(ฉันชอบแนวคิดหลายอย่างที่ใช้วิธีทำให้เทคนิคมีประสิทธิภาพใช้งานได้จริงและอื่น ๆ

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

แต่ใช่ด้วยเหตุผลที่บางคนชอบให้ตรวจสอบคำถาม Stack Overflow เหล่านี้:

อาจมีคำถามอีกสองสามข้อที่เกี่ยวข้องกับคำถามเหล่านั้นด้วย


26
msgstr "การใช้ไวยากรณ์ที่น่ากลัว" #:. บางทีมันอาจจะนานเกินไปตั้งแต่ฉันเป็นมือใหม่ Lisp แต่ความเรียบง่ายและความสม่ำเสมอของไวยากรณ์ Lisp เป็นคุณลักษณะที่ยิ่งใหญ่เพราะนั่นคือสิ่งที่ทำให้ฉันสามารถขยาย Lisp ในตัวเองได้ ฉันสามารถเพิ่มตัววนซ้ำแบบกำหนดเองได้ฉันสามารถเพิ่มขอบเขต "with-xxx" ใหม่ที่สร้างขึ้นโดยอัตโนมัติหลังจากทำความสะอาดดังนั้นผู้พัฒนาจึงไม่จำเป็นต้องทำ ฯลฯ ไวยากรณ์คือคุณลักษณะไม่ใช่ข้อผิดพลาด
Michael H.

5
ความสามารถในการขยายภาษาด้วยตัวเองไม่จำเป็นต้องใช้ไวยากรณ์ที่ จำกัด เพียงครึ่งตัวอักขระ นอกจากนี้: "ไวยากรณ์เป็นคุณลักษณะไม่ใช่จุดบกพร่อง"หรือไม่ - ฉันรู้ว่า. ฉันไม่ได้เรียกมันว่าบั๊ก
Peter Boughton

8
โอเคคุณจะได้ประโยชน์จากระบบมาโครได้อย่างไร มีกี่ภาษาที่อนุญาตให้คุณสร้างส่วนขยายแบบเชิงวัตถุให้กับพวกเขาในหนึ่งบทสั้น ๆ ที่สมเหตุสมผล (Paul Graham, "On Lisp")
David Thornley

6
ไวยากรณ์ไม่ได้น่ากลัวไปกว่าภาษาอื่น ๆ ฉันพบว่าเครื่องหมายวงเล็บ "หายไป" หลังจากนั้นสักครู่ ด้วยการเยื้องที่ดีรหัสสามารถอ่านได้ง่าย
Barry Brown

8
แต่การที่มีความสามารถในการเคลื่อนที่ระหว่าง S-exps ดูเหมือนง่ายมาก ... จากนั้นในเรื่องของวงเล็บฉันชอบข้อความต่อไปนี้: วงเล็บ? วงเล็บคืออะไร ฉันไม่ได้สังเกตเห็นวงเล็บใด ๆ ตั้งแต่เดือนแรกของการเขียนโปรแกรม Lisp ฉันชอบถามคนที่บ่นเกี่ยวกับวงเล็บใน Lisp ว่าพวกเขาถูกรบกวนด้วยช่องว่างทั้งหมดระหว่างคำในหนังสือพิมพ์ "- Ken Tilton
Cedric Martin

9

ฉันจะตีความ "Lisp" เป็น " Common Lisp "; ฉันไม่มีข้อสงสัยคำตอบอื่น ๆ จะพูดว่า " โครงการ " (คำแนะนำ: Lisp เป็นตระกูลภาษา)

"เร็ว" หมายถึงอะไร ในแง่ของเวลาที่ใช้ในการรันเกณฑ์มาตรฐานไม่มันไม่เร็วกว่า C ( แต่อาจเป็น )

"เร็ว" ในแง่ของระยะเวลาที่ใช้ Joe Random Hacker ในการเขียนโปรแกรมทำงานหรือแก้ไขข้อผิดพลาดในระบบซอฟต์แวร์ขนาดใหญ่ เกือบจะแน่นอน

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


จะไม่น่ากลัวถ้าคุณสามารถเขียนฟังก์ชั่นเล็ก ๆ น้อย ๆ ในการแก้ไขของคุณที่จะทำอะไรบางอย่างกับส่วนที่เหลือของรหัสของคุณทันที? หรือคุณสามารถทำเช่นนั้นได้หรือไม่
ทำเครื่องหมาย C

4
@ Mark: ฉันคิดว่าคุณกำลังอธิบาย Emacs
Ferruccio

@Ferruccio ฉันคิดว่าคุณต้องใช้รหัสของคุณก่อน
ทำเครื่องหมาย C

2
@ Mark C: เอาล่ะคุณต้องไฮไลต์ภูมิภาคแล้วM-x eval-region(หรือeval-buffer) แต่นั่นคือทั้งหมด
Frank Shearar

1
@ MarkC: นอกจากนี้หากคุณอยู่ในบัฟเฟอร์รอยขีดข่วนคุณสามารถเขียนฟังก์ชั่นของคุณและกดC-j(ซึ่งเทียบเท่าทางศีลธรรมเพื่อป้อน) และมันจะมีผลทันที
Tikhon Jelvis

7

ฉันชอบ LISP เพราะเป็นสื่อที่ยอดเยี่ยมในการแสดงความคิดเห็นของฉัน เพรดิเคตสำหรับภาษาที่ฉันชอบคือ "ถ้าฉันสามารถเลือกอะไรก็ได้เพื่อแสดงความคิดเห็นมันจะเป็นอย่างไร" ปัจจุบัน Lisp * ( Schemeเป็นแบบเจาะจง) จนถึงจุดที่ฉันพบว่าตัวเองกำลังเขียนบันทึกการเขียนโปรแกรมอยู่ ในฐานะที่เป็นIRLกระดาษและปากกาโน้ต แม้ในขณะที่ฉันกำลังคิดเกี่ยวกับโปรแกรมที่ฉันต้องใช้ใน PHP หรือ Ruby หรือ Python

นี่ไม่ใช่เคล็ดลับที่ฉันสอนตัวเองหรือสิ่งที่ฉันทำเพื่อความน่าเชื่อถือที่น่าเบื่อ (ไม่มีใครได้เห็นข้างในสมุดบันทึกของฉัน) มันเป็นเพียงแค่เสียงกระเพื่อมที่เป็นธรรมชาติมากสำหรับฉันที่จะคิดในทางเลือกใด ๆ และภาษาใด ๆ ที่สะท้อนกับคุณว่าลึกเป็นสมบัติที่คุณ

* เช่นเดียวกับเชิงอรรถแฮสเคลล์กำลังปิดช่องว่างอย่างรวดเร็วเมื่อฉันเรียนรู้เพิ่มเติม


6

ปัญหาคือพลัง พลังงาน = ทำงาน (ฟังก์ชันการทำงานของโปรแกรม) / เวลา

“ เราไม่ได้ชนะการเขียนโปรแกรม Lisp; เราอยู่หลังโปรแกรมเมอร์ C ++ เราสามารถลากพวกเขาจำนวนมากประมาณครึ่งทางไปที่ Lisp”

- Guy Steele ผู้เขียนร่วมของ Java spec

เขียนกราฟระหว่าง C ++ กับ Java ขับต่อไปและในบางจุดที่คุณจะพบว่า Lisp


2
ปัญหาที่นี่คือคุณสูญเสียการใช้งาน C ++ จำนวนมากไปที่ Java แต่รับมันอีกครั้ง (มักจะอยู่ในรูปแบบที่ปรับปรุงแล้ว) เมื่อไปที่ Lisp
David Thornley

@DavidT คำถาม SO บนเครื่องหมายคำพูดที่แน่นอนนั้นมีลิงก์ไปยังแหล่งที่มา (ค้นหา "อ้างอิง") ไม่ควรอ้างคำพูดอย่างจริงจัง
ทำเครื่องหมาย C

@David: เช่นเดียวกับมาโคร ไม่ใช่แค่พวกเขาปล่อยให้พวกเขาออกไปที่ Java (และด้วยเหตุนี้ C #) แต่พวกเขาทำให้พวกเขาขาด "คุณธรรม" มาโครมีประโยชน์จริง ๆ ถ้าฉันสร้าง DSL บนภาษาพื้นฐาน
Mike Dunlavey

@ ไมค์ Dunlavey: ฉันไม่ชอบมาโครใน C ++ จริงๆ (ห่าฉันไม่ชอบพวกมันใน C แต่ฉันไม่มีทางเลือกมากนัก) ฉันชอบมาโครใน Common LISP มาก คุณรู้ไหมฉันคิดว่าปัญหาของฉันกับความคิดเห็นนั้นคือฉันชอบทั้ง C ++ และ Common LISP มากกว่าที่ฉันชอบ Java
David Thornley

@ David: ฉันอยู่กับคุณ 100% สำหรับมาโครใน Lisp ใน C / C ++ พวกเขาจะน่าเกลียดและมีแนวโน้มที่จะทำผิดกฎ แต่สำหรับชนิดของ (คนชายขอบที่ยอมรับ ) สิ่งที่ผมทำพวกเขากำลังเพื่อให้มากดีกว่าไม่มีอะไร แน่นอนว่าเมื่อฉันทำมันใน C ++ มันสามารถถูกมองว่าเป็นการละเมิดได้เป็นอย่างดี แต่ใน Lisp มันถือว่าอบอุ่นอย่างชาญฉลาด ไปคิด
Mike Dunlavey

6

พอลเกรแฮมตอบคำถามนี้ด้วยตนเองในสิ่งที่ทำให้แตกต่างออกไป

โปรดจำไว้ว่าเขาใช้มันสำหรับการเริ่มต้นของเขาในช่วงกลางปี ​​1990 ดังนั้นPythonและRubyจึงไม่ได้เติบโตเต็มที่ในตอนนั้น (หรืออาจจะไม่เกิดเลยก็ได้)

เสียงกระเพื่อมมีข้อดีทั้งหมดของภาษาแบบไดนามิกและฉันคิดว่าส่วนใหญ่ของเว็บแอปพลิเคชั่นในปัจจุบันนี้ Python และ Ruby นั้นยอดเยี่ยมมากและพวกเขาก็มีข้อดีของเฟรมเวิร์กและเอกสารประกอบ

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

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


บทความโดย Paul Graham นั้นน่าสนใจเพราะบันทึกสองสามภาษาส่วนใหญ่ในทุกวันนี้ดูเหมือนจะมีคุณสมบัติที่เขาเขียนไว้ บางที Lisp ก็น่าสนใจกว่าในสมัยนั้น ทุกวันนี้มันมีคุณค่ามากกว่าภาษาที่แนะนำคุณสมบัติเหล่านั้นหรือไม่?
Andres F.

AST เนื่องจากไวยากรณ์ภาษายังคงเป็นโดเมนของ Lisp ฉันไม่ทราบว่าภาษาที่ไม่ใช่เสียงกระเพื่อมที่แมโครมีทั้งภาษาในช่วงเวลารวบรวม (โดยปกติแล้วคอมไพเลอร์มือเรียกแมโครเพื่อนิยามแมโครซึ่งเป็นโปรแกรม Lisp ด้วยตัวเองคุณต้องการที่จะทำ http และ db ในแมโครในเวลารวบรวม ?)
przemo_li

6

ฉันมีอาการหัวเข่ากระตุกต่อSchemeในอดีต แต่ตอนนี้ฉันพร้อมที่จะยิงLisp ( Clojure ) จริง ๆ

คุณเห็นไหมว่าหลายปีที่ฉันเลือกภาษาเช่น Java, C #, C ++, Python และสิ่งต่างๆก็ไม่ได้ท้าทายอีกต่อไป

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

Yay LISP!

แก้ไข: ITA Software ก่อตั้งโดย MIT grads และ Scheme / Lisp เป็นภาษาเดียวที่ MIT ของ grads เรียนรู้ เพื่อความเป็นธรรม แต่เราสามารถอัลกอริทึม Lisp แบบ hot-swap บนระบบที่ใช้งานจริงซึ่งเป็นข้อดีอย่างมาก


8
เรื่อง: สิ่งต่าง ๆ ไม่ได้ท้าทายอีกต่อไปให้เวลากับ Haskell และแจ้งให้เราทราบว่าคุณคิดอย่างไร นอกจากนี้คุณยังสามารถลองเรียนรู้ INTERCAL สำหรับการเปลี่ยนแปลงได้ตลอดเวลา!
ทำเครื่องหมาย C

3
@ Mark C, ขอโทษ INTERCALแต่ผมไม่ได้สัมผัส ความท้าทายไม่ได้เป็นเพียงแค่เกณฑ์ มันจะต้องสามารถแก้ไขปัญหาจริงได้อย่างรวดเร็วเช่นกัน อย่างน้อย Haskell ก็ถูกใช้และเป็นที่รักของหลาย ๆ คน
งาน

แน่นอนว่าเป็นเรื่องตลก
มาร์กซี

1
การอัปเดตรหัสเรียกใช้ (อย่างระมัดระวัง!) บนเซิร์ฟเวอร์ที่ใช้งานจริงเป็นหนึ่งในความสุขของ Lisp ใช่ Python อย่างน้อยตอนที่ฉันเล่นด้วยมันก็ทำได้ไม่ดี คุณจะต้องรวบรวมฟังก์ชั่น / วิธีการทั้งหมดที่อ้างถึงการเปลี่ยนแปลงของคุณอีกครั้งในขณะที่การใช้งาน Common LISP ทั้งหมดนั้นจัดการให้คุณ ฉันใช้พลังเดียวกันนี้เพื่อการพัฒนา: เขียนทดสอบบางสิ่งแก้ไขทดสอบ - ไม่คอมไพล์ลูปและคุณสามารถทำการทดสอบแบบโต้ตอบและเปลี่ยนเป็นแบบทดสอบหน่วยหากคุณต้องการ
Michael H.

@ งานฉันลืม ... PLEASE?
ทำเครื่องหมาย C

6

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

ต้องการวัตถุ? คุณสามารถมีพวกเขา ต้องการเขียนโปรแกรมการทำงานหรือไม่ คุณสามารถมีมัน ต้องการการเขียนโปรแกรมตรรกะสไตล์Prologหรือไม่? เขียนมาโครบ้าง ต้องการโปรแกรมมิงแบบ SQL ที่ประกาศหรือไม่ ไปเลย ต้องการใช้กระบวนทัศน์บางอย่างที่ยังไม่ได้คิดค้น ฉันมั่นใจว่าสามารถทำได้ใน Lisp

นอกเหนือจากภาษาที่เหมือนมาฉันยังไม่เห็นภาษาอื่นให้ความยืดหยุ่นในระดับนี้


+1 การเขียนโปรแกรมกระบวนทัศน์หลายทศวรรษล่วงหน้า F # จุดดีมาก
Orbling

ฉันหวังว่าฉันจะสามารถลงคะแนนสิบครั้งนี้ ไม่มีช้อน ... ไม่มีกระบวนทัศน์ ... มันอธิบายความรู้สึกของฉันเกี่ยวกับ Common LISP ด้วยความแม่นยำที่ยอดเยี่ยม :)
MadPhysicist

5

"เร็วกว่า" ไม่ใช่เรื่องง่ายที่จะวัด - มันขึ้นอยู่กับแง่มุมที่คุณใช้ในการเปรียบเทียบ ขึ้นอยู่กับภารกิจและการใช้ Lisp ความเร็วสามารถเข้าใกล้ C. ดูที่Great Benchmarking Shoot-Outเพื่อดำน้ำเพื่อดูรายละเอียด การใช้ SBCL ของ Lisp นั้นเทียบเท่ากับ Java 6 Server และเร็วกว่า Ruby หรือ Python อย่างมาก

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

ลองนึกภาพการเขียนอีเมลที่หลังจากทุกบรรทัดคุณต้องกดปุ่มเพื่อรวบรวมผลลัพธ์อีเมลของคุณไปยังหน้าจอก่อนที่จะดำเนินการต่อความคิดของคุณ นั่นคือสิ่งที่เขียนด้วยภาษาจาวาหรือภาษาอื่นที่เป็นของฉัน บางครั้งมีเหตุผลในการทำเช่นนั้นและฉันชอบ Java ที่ดี แต่ Lisp ตอบสนองได้ดีขึ้นและง่ายต่อการทำงานให้สำเร็จ


ถ้าฉันเริ่มใหม่วันนี้ฉันอาจเลือก Ruby - มันเป็นสิ่งที่สืบทอดมาจากธรรมชาติ Lisp แต่มันมีห้องสมุดที่ทันสมัยกว่าและมีเผด็จการผู้ใจดีคนหนึ่งขับมันไป แต่นั่นไม่ใช่คำถามที่ OP ถาม
Michael H.

จริง ๆ แล้วฉันเลือกทับทิมเพื่อเริ่มต้นและตอนนี้ฉันกำลังพยายามเรียนรู้ newLisp
philosodad

5

ฉันกำลังเรียนรู้ Lisp ( newLisp ) ด้วยเหตุผลสองประการ

เหตุผลข้อที่หนึ่ง: เสียงกระเพื่อมทำให้ฉันคิดแตกต่างกันซึ่งทำให้ฉันเป็น coder Ruby ที่ดีขึ้น

ดูเหมือนจะไม่สะดวกที่จะทำสิ่งต่าง ๆ ใน Lisp เช่นการทำซ้ำแบบซ้อนเพื่อให้ผ่านหลาย ๆ รายการ ดังนั้นมันบังคับให้ผมใช้สิ่งอื่น ๆ mapเช่น ภาษาที่ฉันชอบคือ Ruby มีวิธีการใช้แผนที่เหมือนกัน แต่ฉันก็ไม่ค่อยได้ใช้เพราะมันไม่คุ้นเคย: ฉันเรียนรู้ที่จะทำสิ่งต่าง ๆ โดยใช้เทคนิคที่ไม่ดีและเมื่อภาษารองรับเทคนิคนั้นฉันก็ยังใช้ต่อไป

เหตุผลข้อที่สอง: เสียงกระเพื่อมเป็นประโยชน์และมีห้องสมุดที่ทันสมัยดี

มีความสุขมากกรอบเว็บน้ำหนักเบาสำหรับ newLisp เรียกว่าเป็นแมลงปอ สิ่งนี้ทำให้ฉันสามารถใช้รหัส newLisp แทน PHP สำหรับงานบางอย่าง ฉันไม่ชอบ PHP และ newLisp ดูเหมือนสนุกกว่าสำหรับงานเฉพาะนี้มากกว่า Ruby

จำนวนเหตุผลที่สาม: เสียงกระเพื่อมเป็น syntactically และแนวคิดที่สอดคล้องกัน

สำหรับฉันนี่เป็นข้อแตกต่างที่สำคัญระหว่าง Ruby และ Python ความสอดคล้อง


+1: "เสียงกระเพื่อมเป็น syntactically และแนวความคิด" นี่เป็นคุณสมบัติที่สำคัญมากของภาษา บางภาษาที่ออกแบบมาไม่ดีขาดความสอดคล้องพวกเขาเป็นเหมือนชุดใหญ่ของสำนวนที่ถูกโยนเข้าด้วยกันในบางคำสั่ง (ฉันมีหนึ่งภาษาในใจ แต่ฉันจะไม่ตั้งชื่อมัน :-)) เสียงกระเพื่อมในแง่นี้สอดคล้องกันมาก ทันทีที่ฉันมีเวลาฉันจะพยายามเรียนรู้อย่างแน่นอน
Giorgio

4

คุณสามารถพูดคำว่า "ความภักดีในแบรนด์" ได้หรือไม่?

ฉันเริ่มที่ Fortran ฉันชอบมัน.

ฉันเปลี่ยนมาเป็นเสียงกระเพื่อม ตอนแรกฉันเกลียดมัน จากนั้นฉันเรียนรู้ที่จะรักและเกลียด Fortran

ต่อมา Pascal, C, C ++, แอสเซมเบลอร์ต่างๆ, C # (อันที่จริงฉันไม่รัก C #)

ฉันเดาว่าไม่แน่นอน


4

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

ฉันคิดว่าเพลงThe Eternal Flameครอบคลุม


ใช่ชัดว่าชัด ๆ เป็นภาษา GCed แรก
Mark C

2

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

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

ระบบ OOP CLOSนั้นอยู่ในระดับของตัวเองในแง่ของความยืดหยุ่น มันยากมากที่จะกลับไปที่พื้นฐาน C ++ / Java / C # OOP หลังจากได้รับรสชาติ  รูปแบบการออกแบบของGoF 5 ไม่จำเป็นเนื่องจากสามารถแสดงได้โดยตรงและโดยตรง

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

ส้นเท้า Achilles ของ Lisp ยุคแรก ๆ คือการใช้หน่วยความจำเพื่อรองรับทั้งคุณสมบัติด้านความปลอดภัยของภาษาและสภาพแวดล้อมการพัฒนาซอฟต์แวร์ขั้นสูงที่รวมอยู่ในนั้นด้วยคุณสมบัติที่น่าทึ่งเช่นเอกสารออนไลน์เต็มรูปแบบรวมถึงกราฟิก Symbol Lisp Machine 64 MB นั้นไม่คุ้มค่ากับการใช้งานกับ 8 MB Sun เวิร์กสเตชัน วันนี้ราคา RAM ได้ทรุดตัวลงและมีความสนใจอย่างมากในภาษา Lisp โดยเฉพาะอย่างยิ่งเมื่อพิจารณาว่าภาษา Java, C #, PHP ที่เป็นกระแสหลักนั้นมีความก้าวหน้าเพียงเล็กน้อยในช่วง 30 ปีที่ผ่านมา

มีภาษาสมัยใหม่ในขณะนี้อยู่ในการแข่งขันกับเสียงกระเพื่อมสำหรับ Mindshare กับนักพัฒนาที่ชาญฉลาด: งูหลามLua , Erlang , HaskellและOCaml แต่ไม่มีผู้ใดเสนอการผสมผสานที่ครบกําหนดการปรับตัวการใช้งานที่สอดคล้องกับมาตรฐานและความเร็วที่หลากหลาย


1

ฉันไม่ได้ทำเสียงกระเพื่อม แต่สถานที่ที่ฉันทำงานอยู่นั้นมีองค์ประกอบที่ จำกัดกับ Fortran เป็นส่วนใหญ่ คนที่นี่ซึ่งฉันเคารพมากที่สุดเกี่ยวกับการคำนวณสิ่งต่าง ๆ ( กลศาสตร์การคำนวณรหัส) คิดว่าการผสมผสานที่สมบูรณ์แบบคือเสียงกระเพื่อมภายนอก (ส่วนใหญ่เป็นเพราะคุณหลีกเลี่ยงปัญหายุ่งกับการจัดการหน่วยความจำ) และ Fortran สำหรับอัลกอริทึมระดับต่ำ ความสามารถของเวกเตอร์ของSSE / AVXและเราคิดว่าโอกาสในการขายนี้ไม่น่าจะปิด)

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