ทำไม Lisp ไม่แพร่หลายมากขึ้น? [ปิด]


50

ฉันเริ่มเรียน Scheme ด้วยวิดีโอ SICP และฉันต้องการย้ายไปยัง Common Lisp ต่อไป

ภาษาดูเหมือนจะน่าสนใจมากและผู้คนส่วนใหญ่เขียนหนังสือเกี่ยวกับภาษานั้นเพื่อสนับสนุนว่ามีพลังในการแสดงออกที่ไม่มีใครเทียบ CL ดูเหมือนว่าจะมีไลบรารีมาตรฐานที่ดี

ทำไม Lisp ไม่แพร่หลายมากขึ้น? ถ้ามันมีพลังจริงๆผู้คนควรจะใช้มันให้จบ แต่มันแทบจะเป็นไปไม่ได้เลยที่จะหาพูดว่า Lisp job jobs

ฉันหวังว่ามันจะไม่ใช่แค่วงเล็บเพราะมันไม่ได้เป็นปัญหาใหญ่หลังจากผ่านไปสักครู่



5
LISP ของ Steel Bank นั้นเป็นที่นิยมมากกว่าที่คุณคิด LISP เช่นตัวประมวลผลแมโคร (เช่น M4) ยังใช้กันอย่างแพร่หลาย คุณอาจไม่เห็นมันในโดเมนที่คุณเลือก แต่ก็ยังอยู่ที่นั่น (ดีขึ้นหรือแย่ลง)
Tim Post

8
แผ่นดินไหวและสึนามิเมื่อไม่นานมานี้ได้ทำลายโรงงานในญี่ปุ่น :-(
oosterwal

1
Lisp รุ่นใดที่เราควรใช้? จำได้ว่าสำเนียง Lisp ไม่เข้ากันมากหรือน้อย

2
LISP (หรือภาษาถิ่น) ถูกใช้ทั่วสถานที่เช่น AutoLISP เป็นภาษาของ LISP ที่ใช้โดย Autocad en.wikipedia.org/wiki/AutoLISPหรือ EMACS en.wikipedia.org/wiki/Emacs_Lisp
Jaydee

คำตอบ:


68

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

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

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

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

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

แม้จะมีทั้งหมดนี้ฉันหวังว่า ...

Clojure มีโอกาสเป็นที่นิยม มันทำงานบน JVM มีการทำงานร่วมกันอย่างยอดเยี่ยมกับ Java และทำให้การเขียนโปรแกรมพร้อมกันง่ายขึ้นมาก สิ่งเหล่านี้ล้วนเป็นสิ่งสำคัญสำหรับหลาย ๆ บริษัท

* นี่เป็นมุมมองของฉันในฐานะโปรแกรมเมอร์ JVM มืออาชีพที่มีประสบการณ์ใน Java, Clojure, JRuby และ Scala


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

2
@ Andrea นั่นเป็นความจริงอย่างแน่นอน มันยากที่จะเรียนรู้เสียงกระเพื่อมแม้ว่าซึ่งก่อให้เกิดปัญหาเช่นกัน ฉันรู้ว่าอาจเป็นความเห็นแย้งเนื่องจากอาจารย์หลายคนสอนโครงร่างเป็นภาษาแรก
dbyrne

8
ใช่ APL เป็นตัวอย่างที่ยอดเยี่ยมของภาษาที่แสดงออก ตัวอย่างที่ดีว่าทำไมความหมายถึงความสำคัญไม่ใช่สิ่งที่สำคัญที่สุด;)
dbyrne

9
ฉันไม่คิดว่าคำจำกัดความนี้สื่อความหมายอย่างชัดเจน โดยส่วนตัวก่อนที่ฉันจะเรียกการแสดงออกทางภาษาฉันจะตรวจสอบให้แน่ใจว่าฉันสามารถอ่านสิ่งที่ฉันเขียนได้ ตัวอย่างเช่นการใช้ตรรกะที่ไม่น่าสนใจใน loop initializer ใน C อาจช่วยให้คุณบันทึกโค้ดบางบรรทัดได้ แต่ไม่สามารถเข้าใจได้ง่าย ในอีกทางหนึ่งรายการความเข้าใจใน Python สามารถบันทึกสองบรรทัดและสามารถอ่านได้มากขึ้น ดังนั้นคุณจะได้พบวิธีที่จะแสดงความหมายที่รัดกุมมากขึ้น ถ้ามันไม่สามารถอ่านได้คุณยังไม่พบวิธีที่จะแสดงอะไรเลย
Andrea

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

17

ทำไม Lisp ไม่แพร่หลายมากขึ้น? ถ้ามันมีพลังจริงๆผู้คนควรใช้มันให้จบ

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

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

แต่มันกลับเป็นไปไม่ได้ที่จะหาพูดแทน Lisp job jobs

สนุกมากพอ บริษัท Lisp พูดตรงข้ามกัน: พวกเขามีตำแหน่งงานว่างอยู่ตลอดเวลา แต่ไม่สามารถหาคนมาเติมเต็มได้ (เช่นเดียวกับ Haskell, ML, O'Caml, Forth, Smalltalk, ... )


3
ฉันอยู่ที่ไหน (อิตาลี) ฉันสงสัยว่าแม้แต่ บริษัท Lisp เดียวก็ยังมีอยู่ ...
Andrea

1
บริษัท ขนาดใหญ่แห่งใดที่กำลังผลักดัน Ruby, Python และ JavaScript JS เป็นกรณีพิเศษที่ได้รับการยอมรับ แต่อีกสองคนกลับได้รับความนิยมอย่างมากโดยไม่มีการสนับสนุนจาก บริษัท / ผู้ขายจำนวนมาก
Ben Hughes

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

อะไรนะ ฉันจะเขียนโค้ดในภาษาใด ๆ ที่ไม่สำคัญแม้ว่า Haskell จะฟังดูเหนือหัวฉัน รหัสขนาดเล็กที่ฉันเขียนไว้นั้นสวยงามมาก แต่ถ้าไม่มีที่ปรึกษาที่ดีฉันก็ไม่รู้จะใช้ Monad และผู้ช่วยผู้บังคับใช้แต่ละคนได้อย่างไร
aoeu256

9

ฉันไม่มีประสบการณ์ในการทำงานกับ บริษัท จริง แต่ฉันรู้ว่าทำไม LISP ถึงยากสำหรับฉันที่จะใช้

ก่อนอื่นสิ่งนี้ทำให้ฉันนึกถึงโพสต์บล็อกนี้: http://steve-yegge.blogspot.com/2006/04/lisp-is-not-acceptable-lisp.html

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

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

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

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

สิ่งที่ไม่ได้มาตรฐานแบบนี้เป็นสิ่งที่เจ็บปวดสำหรับฉันในอดีต C ++ มีปัญหาเดียวกันนี้ แต่ด้วยไลบรารี่อย่าง Boost คุณสามารถแก้ไขจุดอ่อนเหล่านั้นได้

นอกจากนี้ยังไม่ได้ช่วยให้ไวยากรณ์ Lisp สำหรับทุกอย่างนอกเหนือจาก S-expressions นั้นน่าเกลียดนัก


1
PLT Racket (เดิมชื่อ PLT Scheme) ทำงานได้ดีทั้งบน Linux และ Windows
Larry Coleman

ที่น่าสนใจฉันคาดว่า Common LISP จะมีมาตรฐานมากขึ้นและสามารถใช้งานได้กับแอปพลิเคชันจริงมากกว่าที่เป็นแบบแผน (ตอนนี้ฉันกำลังอ่าน Common Lisp ที่ใช้งานได้จริง)
Giorgio

ฉันแนะนำให้คุณเลือก Haskell (ซึ่งเป็นภาษาที่ดีกว่าในความคิดของฉัน) แต่ Clojure เกี่ยวกับอะไร มันทำงานบน JVM ดังนั้นควรพกพาได้และสามารถเข้าถึงไลบรารีทั้งหมดที่คุณต้องการ
Andres F.

อาร์กิวเมนต์บรรทัดคำสั่งยากที่จะใช้ใน C ++? จริงๆ?
Nick Keighley

มันไม่สำคัญที่จะสร้าง cross-complier ที่เปลี่ยน Lisp เป็น Scheme เป็น Clojure หรือไม่? ทำไมคนไม่ใช้พวกเขา?
aoeu256

8

IMO ส่วนใหญ่เกิดจาก:

  • การสนับสนุนห้องสมุดไม่ดี แน่นอนว่าตอนนี้มี Quicklisp ซึ่งทำให้ติดตั้งไลบรารี่ได้ง่าย แต่ก็ไม่ได้ชดเชยพวกเขาที่ยังค่อนข้างน้อยและค่อนข้างน้อยมีเอกสารไม่ดีหรือไม่ได้รับการดูแลอย่างดี เมื่อเทียบกับ Python มีโอกาสดีที่การเขียนแอปพลิเคชั่น Lisp ที่ไม่น่าสนใจ (ไม่ว่าจะใช้ภาษาใด) จะยังคงเกี่ยวข้องกับการสร้างใหม่อย่างน้อยส่วนหนึ่งของวงล้อหรือสอง
  • การขาดความคุ้นเคยกับแบบจำลองที่ใช้โดยเครื่องมือพัฒนา คนส่วนใหญ่ที่ฉันรู้จักถูกข่มขู่โดยใช้ SLIME และ Emacs ซึ่งเป็นที่เข้าใจได้สำหรับคนที่เคยใช้ Eclipse และ Visual Studio มีปลั๊กอิน Eclipse สองอันที่ฉันคิดว่าฉันลองแค่หนึ่งในไม่กี่ปีที่ผ่านมาและมันก็ค่อนข้างบั๊ก ระบบนิเวศเสียงกระเพื่อมทั้งดูเหมือนว่าติดอยู่ครึ่งทางระหว่างวันที่มันเป็นส่วนหนึ่งของระบบการทำงานเสียงกระเพื่อมเต็มรูปแบบและมาตรฐานที่ทันสมัยของโอ้มันเป็นอีกภาษาหนึ่ง การเรียนรู้เสียงกระเพื่อมไม่ได้ จำกัด อยู่ที่การเรียนรู้ภาษาใหม่ - คุณต้องเรียนรู้วิธีการทำงานและการคิดที่แตกต่างไปจากเดิมอย่างสิ้นเชิงและในขณะนี้ก็ไม่เป็นไรถ้าคุณทำมันเป็นงานอดิเรก ธุรกิจ

สิ่งต่าง ๆ เริ่มดูดีขึ้นเล็กน้อยโดยเฉพาะอย่างยิ่งเมื่อ Clojure อยู่ใกล้ ๆ


1
"คนส่วนใหญ่ที่ฉันรู้จักถูกข่มขู่ด้วยการใช้ SLIME และ Emacs ซึ่งเป็นที่เข้าใจได้สำหรับคนที่เคยใช้ Eclipse และ Visual Studio": ฉันรู้สึกว่า Lisp เป็นของชนชั้นสูง
Giorgio

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

มีการแสดง "การเพิ่มผลิตผล" นี้หรือไม่? แน่นอนว่ามันไม่ชัดเจนสำหรับฉัน (ใช่ฉันเคยตั้งโปรแกรมในภาษา Lisp) ไม่มีกระสุนเงิน
Nick Keighley

5

ฉันเรียน LISP เมื่อหนึ่งพันล้านปีก่อนในวิทยาลัย

LISP เช่น FORTH นั้นยอดเยี่ยมสำหรับตรรกะ แต่การเขียนโปรแกรมส่วนใหญ่ไม่เกี่ยวกับตรรกะมันเกี่ยวกับการจัดการข้อมูลด้วยวิธีการทางกลที่น่าเบื่อ ตัวอย่างเช่นในเวลานั้นไม่มีวิธีที่จะแสดงผลตัวเลขที่ถูกต้อง

LISP เกี่ยวกับการทำงานที่ซ้อนกันและผู้คนก็ไม่คิดอย่างนั้น พวกเขาคิดในแง่ของ DO A, B, C, D จากนั้น E ไม่ทำ A ซึ่งเกี่ยวข้องกับการทำ B และ C จากนั้น D และ E สิ่งนี้เกี่ยวข้องกับการเกิดพร้อมกันซึ่งทำให้สับสน ยกเว้นงานที่กำหนดไว้ล่วงหน้าเช่น "ยื่นแบบแสดงรายการภาษีรายได้" คนไม่คิดพร้อมกันพวกเขาคิดตามลำดับ นี่คือเหตุผลว่าทำไมภาษาขั้นตอนจึงมีอิทธิพลเหนือทุกวันนี้

เป็นผลให้รหัส produral liks Java และ C สามารถแปลเป็นภาษาอังกฤษได้อย่างง่ายดาย รหัส LISP ไม่สามารถ; ไม่มีภาษาของมนุษย์ที่มีโครงสร้างในลักษณะนี้

มันยอดเยี่ยมสำหรับการแก้ปัญหา แต่การแก้ปัญหานั้นไม่สำคัญมากในการเขียนโปรแกรม การป้อนข้อมูลการตรวจสอบความถูกต้องการจัดรูปแบบผลลัพธ์ LISP ทั้งหมดนั้นอ่อนแออย่างมาก


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

4
การเขียนโปรแกรมไม่ได้เกี่ยวกับการแก้ปัญหา? ฉันไม่คิดอย่างนั้น และโดยวิธีการที่ฉันไม่คิดว่าคุณสามารถเรียนรู้ภาษาในวิทยาลัยอย่างใดอย่างหนึ่ง
Adam Arold

+1 ฟังดูมีเหตุผลมากสำหรับฉันที่ไม่รู้จัก LISP ใด ๆ ฉันจะระบุเหตุผลเดียวกันว่า C / Java ดีกว่า Python สำหรับโซลูชันขนาดองค์กร
Jonas Byström

นี่เป็นคำตอบเดียวที่ยกหัวข้อใหญ่ของ functional vs procedure แต่อย่าลืมว่าการคิดเชิงกระบวนมีแนวโน้มที่จะชอบการคล้อยตาม globs ของข้อมูลใน vars ทุกที่ที่คุณสามารถสัมผัสได้จากหลาย ๆ ที่และการสร้างปัญหาการซิงโครไนซ์ ฟังก์ชั่นไม่ประสบเร็วจากนี้ฟังก์ชั่นที่เขียนดีไม่ประสบเลย
maxpolk

1
โปรแกรมเมอร์เคยถามฉันว่าวิธีที่ดีที่สุดในการแสดงลูป for a โดยใช้ไดอะแกรม data-flow เป็นอย่างไร สำหรับคนดังกล่าวไม่มีจุดที่จะเป็นภาษาที่ไม่ใช่ขั้นตอน การคิดใน FORTRAN
Nick Keighley

5

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

ด้วยภาษา OOP เช่น Java หรือ C # คุณสามารถใช้ระบบชนิดเพื่อเพิ่มตัวเองไปสู่รูปแบบการทำงานและสร้างมันขึ้นมา ด้วย Lisp (หรือ Lua หรือ Javascript สำหรับเรื่องนั้น) มีความคิดที่ว่าคุณสามารถออกไปข้างนอกและทำตามที่คุณต้องการ ถ้าคุณต้องการ OOP เพียงแค่สร้างระบบ OOP ของคุณเอง! ยกเว้นการสร้าง OOP ของคุณเองหรือการเรียนรู้ของคนอื่นเป็นอุปสรรคใหม่ในภาษาก่อนที่คุณจะได้รับโปรแกรมที่ใช้งานได้ นอกจากนี้ฉันมักจะรู้สึกเหมือน OOP ใน Lisp หรือ Lua ไม่ได้อยู่ที่นั่นเหมือนฉันสามารถเพิกเฉยได้ถ้าฉันต้องการจริงๆดังนั้นประเด็นคืออะไร?

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

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


2
Common Lisp อย่างน้อยเป็นภาษา OO อย่างชัดเจน: Common Lisp Object System เป็นส่วนหนึ่งของมาตรฐาน
Frank Shearar

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

เสียงกระเพื่อมช่วยให้คุณใช้การปิด (ให้มากกว่าแลมบ์ดา) แทนวัตถุสำหรับ OOP ที่มีน้ำหนักเบา แต่ฉันเชื่อว่ามันง่ายต่อการอัพเกรดเพื่อใช้ OOP ผ่าน CLOS
aoeu256

2

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

ฉันพบว่าไม่มีคำตอบที่สมบูรณ์ครบถ้วน

ความไม่รู้อาจเป็นสาเหตุของความนิยมที่ขาดหายไป แต่สิ่งที่ทำให้ฉันไขปริศนามากกว่านั้นคือใครที่รู้เรื่อง Lisp (ตัวอย่างเช่น Google - Peter Norvig ทำงานให้กับพวกเขา) ไม่ได้ใช้มัน

คำอธิบายเพียงบางส่วนที่ฉันคิดขึ้นมาคือความคิดที่ยิ่งใหญ่ของ Lisp ตอนนี้กลายเป็นเรื่องธรรมดาไปแล้วสิ่งเดียวที่ขาดหายไปที่สำคัญมาก (IMO สำคัญอย่างยิ่งที่สำคัญอย่างยิ่ง) คือความง่ายในการ

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

Metaprogramming นั้นยากกว่ามาก (และ meta-metaprogramming มากขึ้นเรื่อย ๆ ) และโปรแกรมเมอร์และผู้จัดการส่วนใหญ่เห็นได้ชัดว่าชอบคำตอบที่ว่า "ไม่มีใครต้องการ"

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

ฉันคิดว่าวิธีแก้ปัญหาความซับซ้อนเป็นเครื่องมือที่ทรงพลังและการศึกษา เห็นได้ชัดว่าแนวโน้มเป็นเครื่องมือทื่อแทนและทำท่าไม่ได้ปัญหา


+1 สำหรับ "ฉันคิดว่าวิธีแก้ปัญหาความซับซ้อนเป็นเครื่องมือและการศึกษาที่มีประสิทธิภาพ"
Giorgio

หลังจาก 50 ปีข้ออ้าง 'ไม่รู้' สวมใส่ค่อนข้างสวย
Nick Keighley

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

@ 6502: ในขณะที่ไม่สามารถใช้งานได้หมดจด IMO Lisp สนับสนุนการเขียนโปรแกรมใช้งานได้ดีกว่าภาษากระแสหลักจำนวนมากเช่น C #, Java, C ++ และอื่น ๆ สำหรับโปรแกรมเมอร์จำนวนมาก FP หมายถึงการใช้แลมบ์ดาเป็นครั้งคราว: โปรแกรมเมอร์เหล่านี้จะไม่พลาด Lisp หรือ Clojure หรือ Haskell ดังนั้นฉันจะเพิ่ม: (1) Lisp สนับสนุน FP ค่อนข้างดีและโปรแกรมเมอร์ที่ใช้งานได้จะได้ประโยชน์จากมัน แต่ (2) ไม่รู้เกี่ยวกับ FP และประโยชน์ของมันคือเหตุผลหนึ่งที่ทำให้ Lisp ไม่ได้ใช้บ่อยขึ้น
Giorgio

1
@ 6502: การมีรายการเป็นโครงสร้างข้อมูลพื้นฐานและฟังก์ชั่นตามลำดับสูงในรายการก็เป็นคุณสมบัติที่ขาดหายไปใน Javascript และเท่าที่ฉันจำได้จาวาสคริปต์ก็มีคู่คำสั่ง / การแสดงออก แน่นอนฉันจะวาง Lisp (Common Lisp) อีกไม่กี่ก้าวในทิศทางของ FP มากกว่า Javascript หรือ Python ด้วยสิ่งนี้ฉันไม่ได้หมายความว่า Common LISP เป็นภาษาที่ใช้งานได้จริงฉันยอมรับว่ามันเป็นกระบวนทัศน์หลากหลาย แต่สนับสนุน FP ได้ดีกว่าภาษาหลายกระบวนทัศน์อื่น ๆ
Giorgio

1

ดูเหมือนว่าแม้ CL จะไม่ได้รับการสนับสนุนห้องสมุดที่ดีมาก อย่างน้อยตามคนที่เปลี่ยนจาก Lisp เป็น Python:

http://www.redmountainsw.com/wordpress/archives/reddit-switches-from-lisp-to-python

โดยส่วนตัวฉันรู้จักโครงการและสนุกกับการเล่น แต่ไม่สามารถจินตนาการถึงการทำโครงงานที่ไม่สำคัญในภาษานั้น


2
นี่ไม่เป็นความจริงอีกต่อไป Quicklispแก้ไขปัญหานั้น

2
นอกจากนี้ยังมีมูลค่าการกล่าวขวัญว่าด้วย CFFI ห้องสมุด C ใด ๆ สามารถใช้งานได้จาก Common LISP CFFI มีเอกสารที่ดีและทำงานได้ดี ในทางตรงกันข้ามถ้าใช้เวลาสองสามชั่วโมงในการเขียนฟังก์ชั่นห่อหุ้มสำหรับฟังก์ชั่น C มีผลกระทบอย่างมากต่อโครงการของคุณ Lisp อาจไม่ใช่ตัวเลือกที่เหมาะสมสำหรับมัน
Larry Coleman

ฉันทำโครงการที่ไม่สำคัญใน Scheme และรู้จัก บริษัท ที่ใช้ Scheme (Chicken Scheme) สำหรับผลิตภัณฑ์หลายชนิด
Giorgio

1

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

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

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

ในทำนองเดียวกันคุณจะเห็นภาษาเช่น Java / Python ดีมากและฉันจะบอกว่าดีที่สุดสำหรับงานบางอย่าง Python โดยเฉพาะดีมากและง่ายต่อการเรียนรู้และเขียน ภาษาเหล่านี้ยังทำได้ดีมากหากจุดปลายข้อมูลของคุณเป็นมาตรฐาน การเรียงลำดับของฐานข้อมูลหรือ XML หรือข้อมูลของการเรียงลำดับนั้น ข้อมูลที่มีโครงสร้างพื้นฐาน

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


+1 สำหรับการอ้างถึงหลักการ "ปรับให้เหมาะสมสำหรับกรณีทั่วไป"
Giorgio

ใช่ แต่การปิดของ LISP เป็นการปรับให้เหมาะสมสำหรับกรณีทั่วไปของ Objects นอกจากนี้ฉันยังสงสัยว่าถ้าใครมีการเปลี่ยนแปลงฐานรหัส LISP ของพวกเขาผ่านการรักษามันเป็นต้นไม้และเรียกใช้แบบสอบถามบนมันเช่น JQuery สำหรับ HTML
aoeu256

1

สำหรับการพัฒนาเว็บไซต์ด้วยภาษา Lisp อาจมีปัญหาไก่และไข่นิดหน่อย - เพราะมีคนไม่กี่คนที่ใช้ Lisp โฮสต์ไม่อนุญาตหรือไม่ทำให้ง่ายและเพราะมันไม่ง่าย ใช้มัน. แต่ที่จริงแล้วการทำให้ Lisp ทำงานบนโฮสต์นั้นสามารถทำได้ง่ายกว่าที่คุณคิดแม้ว่ามันจะต้องใช้งานมากกว่าบริการ PHP แบบนอกกรอบก็ตาม ฉันเพิ่งได้รับแอปพลิเคชันที่หลอกลวงใช้งานได้ที่นี่ด้วยความพยายามเพียงเล็กน้อย


0

IMO ส่วนใหญ่เป็นเรื่องของช่วงเวลาที่แย่: Lisp เก่า (และเกือบจะไม่มีคำจำกัดความที่น่าตื่นเต้นอีกต่อไป) นานก่อนที่มันจะเป็นประโยชน์สำหรับคนส่วนใหญ่หรือการใช้งาน Clojure (ตัวอย่างหนึ่ง) มีโอกาสที่ดีกว่ามาก ความสำเร็จจะขึ้นอยู่กับการรับรู้ว่าใหม่ทันสมัยและเจ๋งกว่าสิ่งใด ๆ ที่เป็นประโยชน์ในการใช้งานร่วมกับ Java (และทุกอย่างอื่นที่ทำงานบน JVM) แม้ว่า

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