ฉันควรเรียนรู้อะไรจากโครงการ


10

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

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

มีอะไรพิเศษสำหรับ Scheme / Lisp ที่จะสอนอะไรใหม่ ๆ ให้ฉัน


3
เสียงแหลมมีค่าการเรียนรู้สำหรับประสบการณ์การตรัสรู้ที่ลึกซึ้งที่คุณจะได้เมื่อคุณได้รับมันในที่สุด ประสบการณ์นั้นจะทำให้คุณเป็นโปรแกรมเมอร์ที่ดีขึ้นในช่วงเวลาที่เหลือของคุณแม้ว่าคุณจะไม่เคยใช้ Lisp จริงๆก็ตาม - Eric Raymond
Robert Harvey

1
นอกจากนี้: xkcd.com/297
Robert Harvey

1
@ Robert Harvery: เช่นกัน: xkcd.com/224
Poindexter

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

ดูเพิ่มเติมที่การสอนภาษาการเขียนโปรแกรมในยุคหลังลินแนนและหนังสือที่อ้างอิงในบทความนี้: ภาษาโปรแกรม: การใช้งานและการตีความซึ่งใช้ภาษาแร็กเก็ตซึ่งเป็นภาษาถิ่นของโครงการ
Robert Harvey

คำตอบ:


7

บางทีคุณสมบัติที่สำคัญที่สุดของ Lisp ก็คือ"Code as Data"  คุณจะไม่ได้รับประสบการณ์นั้นในลักษณะเดียวกันกับภาษาอื่น ๆ ใน C # อะนาล็อกที่ใกล้เคียงที่สุดคือต้นไม้แสดงผล

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

Metaprogramming (บางสิ่งที่ Lisp ก็เก่ง) ก็เป็นสิ่งที่คุ้มค่าที่จะเรียน

การตีค่าเฉลี่ยโดย Paul Graham
http://www.paulgraham.com/avg.html


1
ฉันคิดว่าเหตุผลที่ฉันไม่เคยมี "aha!" ช่วงเวลาที่ ESR สัญญากับฉันคือฉันได้เปิดเผย "code as data" ใน Prolog แล้ว
Frank Shearar

1
Haskell มีแอตทริบิวต์ "code as data" หรือไม่ หรือความสวยงามนั้นขึ้นอยู่กับการพิมพ์และการสะท้อนแบบไดนามิกหรือไม่?
Joey Adams

1
@ โจอี้: ฉันคิดว่าความจริงที่ว่าเทมเพลทแฮสเค็ลล์มีอยู่หมายความว่าแฮสเค็ลล์ขาดแอตทริบิวต์ "รหัสเป็นข้อมูล"
j_random_hacker

4

ใช่มันจะช่วยให้คุณคิดแบบเรียกซ้ำ ฉันเรียนเพียงแค่รูปแบบนี้เป็นเวลาหนึ่งเดือนหรือมากกว่านั้นในชั้นเรียนภาษาการเขียนโปรแกรมและช่วยให้ฉันพัฒนาวิธีคิดและแก้ปัญหาการเขียนโปรแกรม

มันมีค่าเสมอที่จะลองกระบวนทัศน์การเขียนโปรแกรมอื่น ๆ จากนั้นคุณกลับสู่โลกของ OO ที่สดชื่นด้วยแนวคิดใหม่ ๆ

ไม่ใช่ไวยากรณ์ แต่เป็นเหตุผลมันคือการออกกำลังกายสมองที่ดี Appart จากการเรียกซ้ำและการใช้งานรายการที่น่าสนใจมี IMHO ไม่มากนัก แต่มันก็คุ้มค่า


ไม่ซ้ำกับแบบแผน ภาษาที่ใช้งานได้ดี (เกือบทุกภาษา) นั้นใช้ได้สำหรับการเรียกซ้ำ

ฉันเห็นด้วย แต่ OP ดูเหมือนว่าจะสนใจในโครงการเมื่อเทียบกับภาษา 'กระแสหลัก' ....
Xavier Nodet

1

ความต่อเนื่อง :

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

และลองใช้ตัวดำเนินการที่ไม่ชัดเจนของ McCarthy :

ในปี 1963 John McCarthy ผู้ประดิษฐ์ Lisp ได้ตีพิมพ์บทความ A A A สำหรับทฤษฎีการคำนวณทางคณิตศาสตร์ที่เขาเสนอฟังก์ชั่น (ในความหมายของโปรแกรมคอมพิวเตอร์) แนวคิดคือ amb (x, y) แรกเท่ากับ x แต่ถ้าในภายหลังจากการคำนวณพบว่าสิ่งนี้นำไปสู่ความขัดแย้งบางอย่างค่าของ x จะถูกเพิกถอนและแทนที่ด้วย y นี่เป็นธุรกิจที่ซับซ้อนกว่าที่คิดไว้มากในตอนแรก การถอนค่าออกมาโดยพื้นฐานหมายถึงการวนกลับสถานะทั้งหมดของการคำนวณกลับไปที่จุดเมื่อ amb คืนค่า x แล้วเลื่อนลงในค่าของ y นี่หมายถึงการแช่แข็งและคัดลอกสถานะทั้งหมดเมื่อ x ถูกส่งคืนเป็นครั้งแรก เมื่อพบความขัดแย้งสถานะทั้งหมดของโปรแกรมจะถูกยกเลิกและแทนที่ด้วยเวอร์ชันที่ถูกตรึงซึ่งเปิดใช้งานอีกครั้ง สถานะแช่แข็งเหล่านี้รู้จักกันในชื่อการต่อเนื่อง ในหลาย ๆ ทางมันเหมือนคำสั่ง GOTO เกี่ยวกับกรด มันสามารถทำให้เกิดการกระโดดไปยังจุดใดก็ได้บนโค้ดของคุณ แต่การดำเนินการต่อเนื่องนั้นดีกว่า GOTOs เพราะพวกมันตอบสนองต่อเหตุผลเชิงตรรกะได้ดีกว่า


1

ฉันสามารถคิดถึงสิ่งต่อไปนี้:

  • มาโครจริง (ใช้ภาษาเต็มกำลังในการสร้างโค้ด)
  • Homoiconicity (data as code, code as data)
  • การประเมินผลขี้เกียจ

ฉันยังคิดว่าภาษาที่กระเพื่อมควรน่ากลัวในการกำหนดภาษาเฉพาะโดเมน (DSL) นั่นเป็นสิ่งที่คุณอาจต้องการอ่านหากคุณยังไม่รู้

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