Lisp สามารถใช้ได้อย่างง่ายดายในลักษณะที่ไม่เปลี่ยนรูปและใช้งานได้จริงหรือไม่?

ฉันมาจากพื้นหลังใน Haskell และฉันต้องการเรียน Common Lisp

มีการพูดคุยกันเป็นอย่างดีว่า CL นั้น "ไม่ใช่ภาษาที่ใช้งานได้" แต่ฉันต้องการทราบว่าสามารถใช้เป็นภาษาที่ใช้งานได้หรือไม่

ตัวอย่างเช่น เป็นไปได้ไหมที่จะใช้ข้อมูลทุกประเภทในลักษณะที่ไม่เปลี่ยนรูป? ดูเหมือนว่าตารางแฮช Lisp ทั่วไปจะถูกตั้งค่าโดยใช้ setf ซึ่งถือเป็นการวางแนวที่ไม่แน่นอน มีวิธีการใช้งานในลักษณะที่ไม่เปลี่ยนรูปหรือไม่?

นอกเหนือจากแง่มุม "IO" ของ Common Lisp (แง่มุม "ล้วนๆ" ของ Haskell) ที่ฉันโต้ตอบกับไฟล์ เครือข่าย ฯลฯ ฉันสามารถเขียนโค้ดใน Lisp ได้อย่างสะดวกสบายและมั่นใจได้ว่าโค้ดจะมีความโปร่งใสในการอ้างอิงหรือไม่

ฉันสามารถคาดหวังคุณสมบัติประเภทนี้จากไลบรารียอดนิยมที่มีอยู่ใน Common Lisp ได้หรือไม่

มีสำนวนหรือแง่มุมทั่วไปของภาษาที่ทำให้สิ่งเหล่านี้ยากหรือไม่?


person Community    schedule 26.01.2019    source แหล่งที่มา
comment
Common Lisp ได้รับการออกแบบอย่างจงใจเพื่อรองรับการเขียนโปรแกรมที่จำเป็น การเขียนโปรแกรมเชิงฟังก์ชัน และการเขียนโปรแกรมเชิงวัตถุเป็นอย่างน้อย วิธีที่คุณใช้มันขึ้นอยู่กับคุณแน่นอน หากคุณเขียนโปรแกรมโดยไม่มีผลข้างเคียงใดๆ คุณจะสร้างโปรแกรมที่มีความโปร่งใสในการอ้างอิง (กล่าวคือ ในภาษา ข้อกำหนด ผลข้างเคียงที่เป็นไปได้ของตัวดำเนินการได้รับการบันทึกไว้อย่างดี)   -  person Renzo    schedule 26.01.2019
comment
การเรียนรู้ Common Lisp แบบเดียวกับ Haskell ที่มีวงเล็บนั้นไม่ค่อยมีประโยชน์นัก เพราะ Common Lisp เป็นภาษาและระบบนิเวศที่แตกต่างกันอย่างมาก 'เมื่ออยู่ในโรม จงทำตามที่ชาวโรมันทำ'   -  person Rainer Joswig    schedule 26.01.2019
comment
คุณพูดว่า มีการพูดคุยกันเป็นอย่างดีว่า CL ไม่ใช่ภาษาที่ใช้งานได้ แต่การตีความของฉันคือว่า ไม่ใช่ เพียง ภาษาที่ใช้งานได้เท่านั้น ถ้า Lisp ไม่ใช่ภาษาที่ใช้งานได้จริง แล้วอะไรล่ะ?   -  person coredump    schedule 26.01.2019
comment
ดูเช่น github.com/danlentz/cl-ctrie   -  person coredump    schedule 26.01.2019
comment
@RainerJoswig ไม่ได้เป็นส่วนหนึ่งของปรัชญา Lisp แม้ว่า ภาษาควรปรับให้เข้ากับกรณีการใช้งาน แทนที่จะบังคับให้ทุกคนใช้มันในลักษณะเดียวกัน   -  person leftaroundabout    schedule 26.01.2019
comment
@leftaroundabout : เหตุใดจึงเพิกเฉยต่อภาษา Lisp ทั่วไปที่มีอยู่ซึ่งมีตัวดำเนินการมากกว่า 1,000 รายการ, ประเภทข้อมูล, โครงสร้างการควบคุม, ตัวแปร, ... อาจจะดีกว่าผิดหวังที่ CL ไม่ใช่ Haskell และเป็นเพียงการทดแทน Haskell ที่ไม่ดี นอกจากนี้ โปรดจำไว้ว่า การสร้างภาษาเพื่อรองรับการเขียนโปรแกรมที่ไม่มีผลข้างเคียงอย่างมีประสิทธิภาพอาจไม่ใช่งานเริ่มต้นหากไม่มีความรู้ภาษาที่ลึกซึ้งยิ่งขึ้น...   -  person Rainer Joswig    schedule 26.01.2019
comment
วิธีใช้ [อะไรก็ตาม] ในลักษณะที่ไม่เปลี่ยนรูปคือการแปลง สำเนา เสมอ ไม่ใช่ต้นฉบับ -- CL เป็นภาษาที่จำเป็น IMO สามารถใช้ภาษาที่จำเป็นใดๆ ในการเขียนโค้ดได้ตามหน้าที่ (เช่น C) กฎการประเมินและเนมสเปซที่แยกจากกันสำหรับฟังก์ชันต่างๆ จะทำให้ฉันรู้สึกแปลกแยกมาก เมื่อเทียบกับ Haskell แต่อะไรก็เป็นไปได้ใน CL   -  person Will Ness    schedule 26.01.2019
comment
ฉันจะบอกว่าจุดแข็งของ CL ก็คือมีหลายกระบวนทัศน์ แน่นอนว่าคุณสามารถปั้นภาษาให้เป็นไปตามความประสงค์และความปรารถนาของคุณได้ แต่ส่วนหนึ่งของปรัชญาของ CL ก็คือการใช้กระบวนทัศน์ที่แตกต่างกัน (FP, OOP, ความจำเป็น, การเขียนโปรแกรมแบบลอจิคัล, ... ) สำหรับส่วนที่เหมาะสมของโปรแกรม และในแง่ของประสิทธิภาพ การใช้การกลายพันธุ์จะมีประสิทธิภาพมาก แต่ในลักษณะที่จำกัด   -  person Gwang-Jin Kim    schedule 28.01.2019


คำตอบ (1)


ใช่แน่นอน แต่ขึ้นอยู่กับว่าคุณต้องการบังคับใช้ข้อจำกัดมากน้อยเพียงใด ระยะทางของคุณอาจแตกต่างกันไป

อย่าเพิ่งกลายพันธุ์

คุณสามารถหลีกเลี่ยง setf และเครื่องจักรสถานที่ทั้งหมดได้ หากคุณต้องใช้ตารางแฮชหรือเวกเตอร์ คุณจะต้องคัดลอกจำนวนมาก แต่สำหรับหลายแอปพลิเคชัน ค่าใช้จ่ายในการรวบรวมขยะยังสามารถจัดการได้ ในหลายแห่ง คุณสามารถใช้ alists หรือ plists ซึ่งสามารถจัดการได้เกือบจะเหมือนกับโครงสร้างข้อมูลเชิงฟังก์ชัน ยูทิลิตี้ที่มีประโยชน์บางอย่างอยู่ใน alexandria เช่น ก. copy-hash-table ซึ่งมีอาร์กิวเมนต์ key เพื่อทำบางสิ่งที่เหมือนกับสมมุติ map-hash-table ฟังก์ชันการทำงานอื่นๆ ทั้งหมด เช่น ฟังก์ชันลำดับที่สูงกว่า map, reduce, remove ฯลฯ มีให้เลือกหลายรสชาติ นอกจากนี้ กรณีการใช้งานบางอย่างสามารถแก้ไขได้อย่างชัดเจนใน loop

นอกจากนี้ยังมีห้องสมุดที่ทำให้สไตล์นี้ง่ายขึ้นอย่างชัดเจนเช่น ก. modf

สิ่งนี้สามารถพาคุณไปได้ไกลทีเดียว ฉันรู้สึกว่ามันง่ายที่จะเห็นว่าคุณละเมิดความโปร่งใสในการอ้างอิงตรงไหนและหลีกเลี่ยงสิ่งนั้น

ใช้โครงสร้างข้อมูลเชิงฟังก์ชัน

มี FSet ซึ่งมีโครงสร้างข้อมูลการทำงานมากมายให้คุณ และมี sycamore ซึ่งให้มากกว่านี้

ใช้ทรานสดิวเซอร์

SERIES ปรากฏใน CLtL2 ในปี 1990 และเกือบจะกลายเป็นมาตรฐานในปี 1994 นอกจากนี้ยังมี taps ซึ่งเพิ่มฟังก์ชันการทำงานที่มีประโยชน์บางอย่าง

นั่งสมาธิ

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

person Svante    schedule 26.01.2019