คำถามติดแท็ก clojure

Clojure เป็นภาษาที่ใช้งานทั่วไปที่สนับสนุนการพัฒนาเชิงโต้ตอบที่สนับสนุนสไตล์การเขียนโปรแกรมที่ใช้งานได้และลดความซับซ้อนของการเขียนโปรแกรมแบบมัลติเธรด

4
Python decorators และ Lisp macros
เมื่อมองนักตกแต่งงูหลามที่มีคนสร้างคำกล่าวไว้พวกเขามีพลังเทียบเท่ากับมาโคร Lisp (โดยเฉพาะ Clojure) ดูตัวอย่างที่ให้ไว้ในPEP 318ดูเหมือนกับฉันราวกับว่าพวกเขาเป็นเพียงวิธีการที่ยอดเยี่ยมในการใช้ฟังก์ชั่นลำดับสูงแบบเก่าใน Lisp: def attrs(**kwds): def decorate(f): for k in kwds: setattr(f, k, kwds[k]) return f return decorate @attrs(versionadded="2.2", author="Guido van Rossum") def mymethod(f): ... ฉันไม่ได้เห็นรหัสใด ๆ เปลี่ยนในใด ๆ ของตัวอย่างเช่นที่อธิบายไว้ในกายวิภาคของมาโคร Clojure พลัส ธ หายไปhomoiconicity อาจทำให้การแปลงรหัสเป็นไปไม่ได้ ดังนั้นทั้งสองเปรียบเทียบกันอย่างไรและคุณสามารถบอกได้ว่าพวกเขามีความเท่าเทียมกันในสิ่งที่คุณสามารถทำได้? หลักฐานดูเหมือนจะชี้ไปที่มัน แก้ไข:จากความคิดเห็นฉันกำลังมองหาสองสิ่ง: การเปรียบเทียบ "มีประสิทธิภาพเท่ากับ" และ "เป็นเรื่องง่ายที่จะทำสิ่งที่ยอดเยี่ยมด้วย"
18 python  lisp  clojure  macros 

1
จะเขียน Clojure Code ได้อย่างไร
ฉันใหม่กับ Clojure ฉันเข้าใจรหัสที่ฉันเขียนได้ แต่มันยากเกินไปที่จะเข้าใจในภายหลัง มันยากที่จะจับคู่วงเล็บ อะไรคือข้อตกลงทั่วไปที่ต้องติดตามเกี่ยวกับการตั้งชื่อและการเยื้องในสถานการณ์ต่าง ๆ ตัวอย่างเช่นฉันเขียนตัวอย่างการกำหนดโครงสร้างตัวอย่างเพื่อทำความเข้าใจ แต่มันดูไม่สามารถอ่านได้อย่างสมบูรณ์ในครั้งที่สอง (defn f [{x :x y :y z :z [a b c] :coll}] (print x " " y " " z " " a " " b " " c)) ในกรณีของการปรับโครงสร้างควรทำโดยตรงที่ระดับพารามิเตอร์หรือเริ่มฟอร์มให้แล้วดำเนินการต่อที่นั่น?

3
Clojure เป็นอิสระจาก Java อย่างไร
ฉันค่อนข้างใหม่สำหรับโลก Clojure ฉันขอขอบคุณความจริงที่ว่าเราสามารถเข้าถึงไลบรารี Java ทั้งหมดได้อย่างง่ายดายผ่านคุณสมบัติ Interop ของ Clojure แต่ฉันสงสัยว่า Clojure ยืนอยู่บนขาของตัวเองมากแค่ไหน แน่นอนว่ามีบางแพลตฟอร์มเช่น Android ที่จำเป็นต้องใช้การทำงานร่วมกันกับ Java ได้ตลอดเวลาเพราะไลบรารีหลักถูกเขียนหรือเปิดเผยใน Java นอกจากนี้เนื่องจากสตริง Clojure เป็นสตริง Java ฉันคาดว่าไลบรารีการจัดการสตริงจะเป็น wrapper ในวิธีการ Java String แต่สำหรับงานอื่น ๆ ฉันไม่เห็นเหตุผลว่าทำไมห้องสมุด Clojure ดั้งเดิมไม่สามารถพัฒนาได้ คิดถึง Http, การจัดการวันที่, การแยกวิเคราะห์ XML, การสร้างเทมเพลต, การทำให้เป็นอันดับ JSON และการดีซีเรียลไลเซชัน, OAuth, ไลบรารีคณิตศาสตร์และอื่น ๆ ดังนั้นคำถามของฉันคือ: Clojure มาไกลแค่ไหนที่จะเป็นอิสระจากระบบนิเวศ Java? มันมีไลบรารี่ของตัวเองสำหรับงานเหล่านี้และงานอื่น ๆ หรือไม่?

1
การจับคู่รูปแบบใน Clojure vs Scala
อะไรคือความแตกต่างที่สำคัญระหว่างการจับคู่รูปแบบในสองภาษานี้ ฉันไม่ได้อ้างถึงไวยากรณ์ แต่ความสามารถรายละเอียดการใช้งานขอบเขตการใช้งานและความจำเป็น แอปพลิเคชัน Scala (เช่น. ยกและเล่น) พูดอย่างภาคภูมิใจเกี่ยวกับรูปแบบภาษาที่ตรงกับความกล้าหาญ ในทางกลับกัน Clojure มีห้องสมุด core.match และสร้างขึ้นในการทำลายซึ่งดูเหมือนว่ามีประสิทธิภาพ * หมายเหตุ: เหตุผลที่ฉันได้รับแรงบันดาลใจในการถามคำถามนี้เป็นเพราะการโพสต์บล็อกที่ฉันเห็นซึ่งโปรแกรมเมอร์ในการทดลองสร้างล่ามเสียงกระเพื่อมโดยใช้ทั้ง Scala และ Clojure เขาบอกว่าการแข่งขัน Clojure แตกหลังจากช่วงระยะเวลาหนึ่ง แต่ไม่สามารถอธิบายได้ว่าทำไม แต่ฉันอยากรู้จริงๆ คุณสามารถค้นหาโพสต์นี้ได้ที่นี่: http://www.janvsmachine.net/2013/09/writing-simple-lisp-interpreter-in-clojure.html

2
เราสามารถสร้างคอมพิวเตอร์ที่ใช้งานได้หรือไม่?
ในท้ายที่สุดแล้วโปรแกรมทั้งหมดของเรามีโครงสร้าง นั่นคือมันไม่สำคัญว่าเราจะสร้างมันให้บริสุทธิ์หรือใช้ประโยชน์ได้อย่างไร - พวกมันถูกแปลเป็นชุดประกอบเสมอดังนั้นสิ่งที่จริง ๆ แล้วสิ่งที่วิ่งอยู่หลังหมวกคือคำแนะนำรัฐและลูป พวกเราเลียนแบบ FP ในฐานะที่เป็นฮาร์ดแวร์ noob คำถามของฉันคือ: ทำไมเราไม่ใช้สถาปัตยกรรมคอมพิวเตอร์ที่คำนวณสิ่งต่าง ๆ ในรูปแบบที่ใช้งานได้จริง? ตัวอย่างเช่นคอมพิวเตอร์อาจประกอบด้วย "functional chips" ดั้งเดิมเช่น "concat", "map" และ "ลด" และโปรแกรมจะบอกคอมพิวเตอร์ว่าจะไหลของข้อมูลระหว่างชิปเหล่านั้นอย่างไรเพื่อคำนวณผลลัพธ์ที่ต้องการ เช่นในภาษาที่ต่อกัน สิ่งนี้ไม่สมเหตุสมผล แต่อาจแสดงสิ่งที่ฉันคิด

2
วงเล็บเหลี่ยมและเครื่องหมายปีกกาใน Clojure ยังคงเป็น S-expressions หรือไม่
ฉันพยายามที่จะเรียนรู้ Lisp และมองดู Lisps ทั้งหมดที่นั่นและความแตกต่างของพวกเขา ฉันเห็นว่าในการใช้งานบางส่วนของ Scheme คุณสามารถใช้วงเล็บเหลี่ยมสลับกันได้กับวงเล็บเหลี่ยมเพื่อความสะดวกในการอ่านดังนั้นเนื่องจากพวกเขาได้รับการปฏิบัติเหมือนกันฉันถือว่าพวกเขายังคงเป็นแค่ อย่างไรก็ตามใน Clojure ฉันเห็นว่ามีการใช้วงเล็บเหลี่ยมและเครื่องหมายปีกกาเพื่อแสดงชนิดข้อมูลต่าง ๆ เช่นเวกเตอร์เป็นต้น สิ่งเหล่านี้ยังคงเป็นนิพจน์ S ที่ถูกต้องหรือไม่หรือจะต้องพิจารณาว่าเป็นอะตอมหรือไม่ สิ่งนี้ "ทำลาย" แนวคิดทั้งหมดของ S-expressions หรือไม่ทำให้ Clojure กลายเป็น "ไม่บริสุทธิ์" ชัด ๆ
12 lisp  clojure 

1
สิ่งที่เป็นปัญหาในทางปฏิบัติเป็นผลมาจากการขาดแมโครที่ถูกสุขอนามัยใน Clojure?
ฉันเคยได้ยินมาโคร Clojure นั้นเขียนได้ง่ายกว่า แต่ไม่น่าเชื่อถือเท่ากับแมโครที่ถูกสุขอนามัยของ Racket คำถามของฉันมี 2 ส่วน: วิธีการที่ไม่gensymแตกต่างจากแมโครที่ถูกสุขอนามัย? มาโคร Racket ให้อะไรที่ Clojure ทำไม่ได้? (ไม่ว่าจะเป็นความปลอดภัยการประกอบหรืออะไรก็ได้)

2
เข้าใกล้ SICP ใน Clojure แทน Scheme
ฉันเป็นนักศึกษาปริญญาตรีปีที่สามในโปรแกรมวิศวกรรมซอฟต์แวร์และฉันได้นำความคิดในการอ่าน SICP ไปยังที่ปรึกษาเพื่อให้ได้ความเข้าใจที่ลึกซึ้งและลึกซึ้งยิ่งขึ้นเกี่ยวกับหลักการที่อยู่เบื้องหลังซอฟต์แวร์ทั้งหมดที่เราออกแบบ เขาแนะนำว่าอย่าเรียนรู้ Scheme เพื่อทำให้หนังสือเล่มนี้สมบูรณ์ (เพราะมันไม่ใช่เรื่องธรรมดาเหมือนภาษาถิ่น Lisp) แต่ให้ทำแบบฝึกหัดใน Clojure แทน มันเป็นหนังสือที่ยากอยู่แล้วถ้าฉันลองทำแบบฝึกหัดของหนังสือเล่มนี้ใน Clojure ที่ทันสมัยกว่านี้มันจะได้ผลอย่างไร ตัวอย่างเช่นฉันไม่สามารถหาคำตอบที่แท้จริงได้ไวยากรณ์ที่พวกเขาสอนสำหรับ Scheme นั้นแตกต่างกัน ฯลฯ
11 clojure  scheme  sicp 

3
การทอโค้ด Byte กับ Lisp แมโคร
ฉันได้อ่านเกี่ยวกับห้องสมุดที่ผู้คนเขียนสำหรับภาษาอย่าง Java และ C # ซึ่งใช้ประโยชน์จากรหัสไบต์ที่ทอผ้าเพื่อทำสิ่งต่าง ๆ เช่นการตัดการเรียกใช้ฟังก์ชันการแทรกรหัสการบันทึก ฯลฯ ฉันได้อ่านมาโคร Lisp / Clojure ด้วย พยายามเข้าใจวิธีการใช้งานให้ดีขึ้น ยิ่งฉันอ่านมาโครมากเท่าไหร่ก็ยิ่งมีความสามารถในการทำงานเหมือนกับไลบรารีการทอโค้ดไบต์ โดยฟังก์ชั่นฉันหมายถึงความสามารถในการจัดการรหัสในเวลารวบรวม ตัวอย่างของห้องสมุดที่ฉันดูอยู่จะเป็น AspectJ, PostSharp และ Cecil มีสิ่งใดบ้างที่สามารถทำได้กับสิ่งหนึ่งและอีกอันหนึ่งไม่ใช่หรือ พวกเขาแก้ปัญหาเดียวกันได้จริงหรือฉันกำลังเปรียบเทียบแอปเปิ้ลกับส้ม?

2
การพัฒนาใหม่ของ Java จะมีผลต่อการทำงานร่วมกันกับภาษาเช่น Scala และ Clojure อย่างไร
เท่าที่ฉันเข้าใจทั้ง Scala และ Clojure ได้รับการออกแบบเป็นภาษาใหม่ที่ ขึ้นอยู่กับ JVM และ รวมเข้ากับโค้ด Java ได้ง่ายในแง่ที่อนุญาตให้ใช้คลาส Java ภายในโค้ด Scala และ Clojure เริ่มต้นด้วย Java 8 (และอาจรุนแรงยิ่งขึ้นกับ Java รุ่นถัดไป) จะมีการเปลี่ยนแปลงในความหมายของภาษา Java ฉันต้องการถามว่าการเปลี่ยนแปลงเหล่านี้จะส่งผลกระทบต่อการทำงานร่วมกันระหว่าง Java และ Scala / Clojure อย่างไรและผลที่ตามมาจะเป็นอย่างไร ตัวอย่างเช่นเนื่องจาก lambdas ใน Java 8 ไม่ใช่วัตถุ (ดูเช่นที่นี่ ) Scala และ Clojure อาจต้องจัดการกับค่า Java ที่ไม่ใช่วัตถุ นี่จะเป็นปัญหาหรือไม่? ฉันนึกถึงสถานการณ์ต่อไปนี้: ภาษา Scala หรือ …
11 java  scala  clojure 

3
ทำไมเราไม่สามารถเขียนฟังก์ชั่นการจดชวเลขซ้อนใน Clojure ได้?
ฉันพยายามประเมินการแสดงออกของ Clojure ด้วยฟังก์ชั่นชวเลขที่ซ้อนกันในวันนี้และมันจะไม่ยอมให้ฉัน การแสดงออกคือ: (#(+ % (#(+ % (* % %)) %)) 5) ; sorry for the eye bleed ผลลัพธ์คือ: IllegalStateException Nested #()s are not allowed clojure.lang.LispReader$FnReader.invoke (LispReader.java:630) ...and a bunch of other garbage

3
แนวทางปฏิบัติที่ดีที่สุดของ Scala หรือ Clojure Functional Programming
ฉันทำการเข้ารหัสด้วยตนเองจำนวนมากได้รับประสบการณ์จากโมเดลการเขียนโปรแกรมแบบขนาน: นักแสดงซอฟต์แวร์หน่วยความจำทรานแซคชันซอฟต์แวร์การไหลของข้อมูล เมื่อฉันพยายามใช้สถาปัตยกรรมเหล่านี้กับชีวิตจริง - ลงในเว็บแอปพลิเคชันที่โหลดสูง - โมเดลใด ๆ ไม่สนับสนุนความทนทานและความคงทนของข้อมูล ภารกิจในชีวิตจริงต้องการบันทึกข้อมูลในตอนท้าย ซึ่งหมายความว่าฉันยังต้องใช้ DB และดักการซิงค์ฐานข้อมูลคอขวดที่ปรับขยายได้ที่เป็นไปได้เป็นต้น ไม่มีใครรู้ตัวอย่างที่ดีของสถาปัตยกรรม (src หรือข้อความหรือไดอะแกรมหรือพิมพ์เขียว) ที่ใช้Akka Actors หรือ Software Transaction Memory และใช้ความคงทนในตอนท้าย? ตัวอย่าง / ความคิดที่ดีสำหรับ Transactional Memory, Actors, Dataflow, Tuple ช่องว่างในแอปพลิเคชันในชีวิตจริงยินดีต้อนรับ

1
ตัวอย่างความเป็นไปได้ของหน่วยความจำทรานแซคชันของซอฟต์แวร์
หนึ่งในข้อได้เปรียบที่สำคัญของหน่วยความจำทรานแซคชันของซอฟต์แวร์ที่ได้รับการกล่าวถึงเสมอคือความสามารถในการประกอบและโมดูล ชิ้นส่วนที่แตกต่างกันสามารถนำมารวมกันเพื่อผลิตส่วนประกอบที่มีขนาดใหญ่ขึ้น ในโปรแกรมล็อคตามนี้มักจะไม่เป็นกรณี ฉันกำลังมองหาตัวอย่างง่ายๆที่แสดงถึงสิ่งนี้ด้วยรหัสจริง ฉันต้องการตัวอย่างใน Clojure แต่ Haskell ก็ดีเหมือนกัน คะแนนโบนัสหากตัวอย่างแสดงรหัสล็อคที่ไม่สามารถเขียนได้ง่าย
11 haskell  clojure  stm 

3
หากคุณสามารถใช้ def เพื่อกำหนดตัวแปรวิธีที่ถือว่าไม่เปลี่ยนรูปได้อย่างไร
พยายามเรียนรู้ Clojure และคุณอดไม่ได้ที่จะได้รับการบอกเล่าอย่างต่อเนื่องว่า Clojure เป็นข้อมูลที่ไม่เปลี่ยนรูปแบบหรือไม่ แต่คุณสามารถกำหนดตัวแปรใหม่ได้อย่างง่ายดายโดยใช้defใช่มั้ย ฉันเข้าใจว่านักพัฒนา Clojure หลีกเลี่ยงสิ่งนี้ แต่คุณสามารถหลีกเลี่ยงการเปลี่ยนแปลงตัวแปรในภาษาใดก็ได้เหมือนกัน บางคนสามารถอธิบายให้ฉันฟังได้ว่าสิ่งนี้แตกต่างกันอย่างไรเพราะฉันคิดว่าฉันขาดมันไปจากบทเรียนและหนังสือที่ฉันอ่าน เพื่อยกตัวอย่างว่าเป็นอย่างไร a = 1 a = 2 ใน Ruby (หรือร้องไห้สะอึกสะอื้นหากคุณต้องการ) แตกต่างจาก (def a 1) (def a 2) ใน Clojure
10 clojure 

2
เราจะใส่รหัส“ ถามโลก” เมื่อเราแยกการคำนวณจากผลข้างเคียงได้อย่างไร
ตามหลักการแบ่งแยกคำสั่งรวมถึงการคิดในข้อมูลและDDD ด้วยการนำเสนอClojureหนึ่งควรแยกผลข้างเคียง (แก้ไขโลก) จากการคำนวณและการตัดสินใจเพื่อให้ง่ายต่อการเข้าใจและทดสอบทั้งสองส่วน นี่เป็นคำถามที่ยังไม่ได้ตอบ: เราควรใส่ "ถามโลก" ที่ไหน ในอีกด้านหนึ่งการร้องขอข้อมูลจากระบบภายนอก (เช่นฐานข้อมูล, บริการนอกระบบ 'APIs และอื่น ๆ ) นั้นไม่ได้อ้างอิงอย่างโปร่งใสดังนั้นจึงไม่ควรใช้ร่วมกับการคำนวณและการตัดสินใจที่บริสุทธิ์ ในทางกลับกันมันเป็นปัญหาหรืออาจเป็นไปไม่ได้ที่จะหยอกล้อพวกเขานอกเหนือจากส่วนการคำนวณและส่งผ่านเป็นอาร์กิวเมนต์เนื่องจากเราอาจไม่ทราบล่วงหน้าว่าต้องการข้อมูลใด

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