หลังจากสองสามเดือนของการเรียนรู้และเล่นกับ Lisp ทั้ง CL และบิตของ Clojure ฉันยังไม่เห็นเหตุผลที่น่าสนใจที่จะเขียนอะไรลงไปแทนที่จะเป็น C #
ฉันจะชอบเหตุผลที่น่าสนใจบางส่วนหรือสำหรับคนที่จะชี้ให้เห็นว่าฉันหายไปบางสิ่งบางอย่างที่ยิ่งใหญ่จริงๆ
จุดแข็งของ Lisp (ต่อการวิจัยของฉัน):
- กะทัดรัดสัญกรณ์ที่แสดงออก - มากกว่า C # ใช่ใช่ ... แต่ฉันดูเหมือนจะสามารถแสดงความคิดเห็นเหล่านั้นใน C # ด้วย
- การสนับสนุนโดยนัยสำหรับการตั้งโปรแกรมการทำงาน - C # พร้อมด้วยวิธีการขยาย LINQ:
- mapcar = .Select (แลมบ์ดา)
- mapcan = .Select (แลมบ์ดา) .regregate ((a, b) => a.Union (b))
- car / first = .First ()
- cdr / rest = .Skip (1) .... เป็นต้น
- การสนับสนุนฟังก์ชั่นแลมบ์ดาและลำดับสูงกว่า - C # มีสิ่งนี้และไวยากรณ์ง่ายขึ้น:
- "(แลมบ์ดา (x) (ร่างกาย))" กับ "x => (ร่างกาย)"
- "# (" กับ "%", "% 1", "% 2" ดีใน Clojure
- วิธีการจัดส่งแยกออกจากวัตถุ - C # มีวิธีนี้ผ่านวิธีการขยาย
- การส่งหลายวิธี - C # ไม่มีสิ่งนี้ แต่ฉันสามารถนำไปใช้เป็นการเรียกใช้ฟังก์ชันในเวลาไม่กี่ชั่วโมง
- โค้ดคือข้อมูล (และมาโคร) - บางทีฉันอาจไม่ได้แมโคร "อากาศ" แต่ฉันไม่ได้เห็นตัวอย่างเดียวที่ความคิดของแมโครไม่สามารถนำมาใช้เป็นฟังก์ชันได้ ไม่เปลี่ยน "ภาษา" แต่ฉันไม่แน่ใจว่าเป็นจุดแข็ง
- DSLs - สามารถทำได้ผ่านการจัดวางฟังก์ชั่นเท่านั้น ... แต่ใช้งานได้
- การเขียนโปรแกรม "exploratory" แบบ Untyped - สำหรับ structs / classes, autoproperties ของ C # และ "object" นั้นทำงานได้ค่อนข้างดีและคุณสามารถเพิ่มการพิมพ์ที่แข็งแกร่งขึ้นได้อย่างง่ายดาย
- ทำงานบนฮาร์ดแวร์ที่ไม่ใช่ของ Windows ใช่เลยเหรอ นอกวิทยาลัยฉันรู้จักเพียงคนเดียวที่ไม่ได้ใช้ Windows ที่บ้านหรืออย่างน้อย VM ของ Windows บน * nix / Mac (จากนั้นอีกครั้งบางทีนี่อาจสำคัญกว่าที่ฉันคิดและฉันเพิ่งถูกล้างสมอง ... )
- REPL สำหรับการออกแบบจากล่างขึ้นบน - ตกลงฉันยอมรับว่ามันดีจริงๆและฉันคิดถึงมันใน C #
สิ่งที่ฉันขาดหายไปใน Lisp (เนื่องจากการผสมผสานของ C #, .NET, Visual Studio, Resharper):
- namespaces แม้จะมีวิธีการแบบคงที่ฉันต้องการผูกพวกเขากับ "ชั้นเรียน" เพื่อจัดหมวดหมู่บริบทของพวกเขา (Clojure ดูเหมือนว่าจะมีสิ่งนี้ CL ดูเหมือนจะไม่ได้)
- การรวบรวมและการออกแบบที่ยอดเยี่ยม
- ระบบประเภทช่วยให้ฉันสามารถระบุ "ความถูกต้อง" ของโครงสร้างข้อมูลที่ฉันผ่าน
- สิ่งที่สะกดผิดจะถูกขีดเส้นใต้เรียลไทม์; ฉันไม่ต้องรอจนกว่าจะรู้
- การปรับปรุงรหัส (เช่นการใช้วิธีการ FP แทนวิธีที่จำเป็น) จะถูกบันทึกอัตโนมัติ
- เครื่องมือพัฒนา GUI: WinForms และ WPF (ฉันรู้ว่า Clojure สามารถเข้าถึงไลบรารี Java GUI ได้ แต่พวกเขาต่างกับฉันทั้งหมด)
- เครื่องมือแก้จุดบกพร่อง GUI: จุดพัก, step-in, step-over, ตัวตรวจสอบค่า (ข้อความ, xml, กำหนดเอง), นาฬิกา, debug-by-thread, เบรกพอยต์แบบมีเงื่อนไข, หน้าต่าง call-stack ที่มีความสามารถในการข้ามไปยังรหัสที่ระดับใดก็ได้ ในกอง
- (เพื่อความเป็นธรรมการ จำกัด ของฉันกับ Emacs + Slime ดูเหมือนจะให้บางสิ่งนี้ แต่ฉันเป็นส่วนหนึ่งของวิธีการที่ขับเคลื่อนด้วย GUI GUI)
ฉันชอบโฆษณาเกินจริงโดยรอบ Lisp และฉันให้โอกาส
แต่มีอะไรที่ฉันสามารถทำได้ใน Lisp ที่ฉันทำไม่ได้ใน C #? อาจเป็น verbose ใน C # อีกเล็กน้อย แต่ฉันก็มีการเติมข้อความอัตโนมัติด้วย
ฉันพลาดอะไรไป เหตุใดฉันจึงควรใช้ Clojure / CL
AND
หรือOR
ทำหน้าที่อย่างไร มันสามารถทำได้ (ให้LAMBDA
ซึ่งเป็นแมโคร) แต่ฉันไม่เห็นวิธีที่ชัดเจนในการทำที่จะไม่ดูดทั้งหมด