Clojure'nin nesi harika? [kapalı]


40

Son zamanlarda Clojure'a bakıyorum ve en iyi uygulamaları izleyen bazı projeleri ve genel olarak iyi Clojure kodunu gösteren Stackoverflow'ta bu yazıya rastladım . Bazı temel dersleri okuduktan sonra başımın çevresini dolaşmak istedim, bu yüzden bazı "gerçek dünya" projelerine baktım.

ClojureScript ve Compojure'a (yukarıda bahsedilen "iyi" projelerden ikisi) baktıktan sonra, sadece Clojure'nin bir şaka olduğunu hissediyorum. Birisi ben Clojure kullanır oysa almaya seviyorum ve böyle temiz sözdizimine sahip ve çok kolay olduğunu, diyelim ki, Ruby veya Python üzerinde iki dil Clojure alacağını neden anlamıyorum bu kadar onun için okunabilirliği kalıntıları her yerde parantez ve sembolleri ben mi.

Ruby ve Python'un güzel, okunabilir ve zarif olduğunu düşünüyorum. İçerideki dili bilmeyen biri için bile okunması kolaydır. Ancak, Clojure benim için opak ve herhangi bir kodu anlayabilmek için dil uygulaması hakkında her küçük ayrıntıyı bilmem gerektiğini hissediyorum.

Öyleyse lütfen beni aydınlat!

  • Clojure'nin nesi iyi?
  • Anlayabilmek için dil hakkında bilmem gereken en düşük minimum nedir?

14
I don't understand why someone would pick Clojure over say, Ruby or Python- jvm üzerinde çalışır ve tüm java kütüphanesini kullanabilir. ... have such a clean syntaxtartışmalı, lisp benzeri işlevsel dillerin çok temiz bir sözdizimine ve yapısına sahip olduğu, çoğu insanın alışmadığı bir tanesi.

22
Onun adı seksi.
programcı

4
Bir bodrum katında yaşayan herhangi bir genç, Python ve Ruby'yi birkaç ay içinde alabilir. Eğer kullanmak istedikleri buysa, bodrumdan asla çıkamayacaklar. Uzun yıllardır profesyonel Python gelişimi yapmış birinin gömülü C yazan birine kıyasla daha az ölümlü olduğunu söylemiyorum, ancak Python ve Ruby tüm bildikleri ve bilmek istedikleri her şeyse, o zaman bir şey balıktır. Bu arada, işlevsel programlama ve Lisps'ı keşfetmekten ve takdir etmekten mezun olduktan sonra beni 6 yıldan fazla süre aldı. Scheme’e ilk tepkim dizlikti.
İş

4
"Muhtemelen, lisp benzeri işlevsel diller çok temiz bir sözdizimine ve yapısına sahiptir, çoğu kişi alışkın olmayanlardan sadece bir tanesidir.": Lisp ile çok az deneyime sahibim ve "Practical Common Lisp" kitabını okumaya başladım. Şimdiye kadar, sözdizimi ile ilgili herhangi bir sorunla karşılaşmadım; IMHO, Lisp benzeri sözdiziminin daha az okunabilir olması hakkındaki mitleri sadece FUD.
Giorgio

4
Yakın zamanda Clojure'a bakmaya başladım (ancak Haskell ve Scala ile daha önce deneyimim var, bu yüzden sözdizimi böyle bir şok değil). Aslında şaşırtıcı bir şekilde okunabilir buldum. fewParantez dışında birçok dile kıyasla çok sembol var ve neredeyse hiç ayrılmış sözcük yok. Bunu okunamaz bulmanızın nedeni, tamamen yeni bir paradigma olması ve tipik bir Nesne Yönelimli dilden temelde farklı bir şekilde çalışmasıdır. Biraz zaman ve güç ver.
KChaloux

Yanıtlar:


47

Verdiğin arka plan için, eğer şöyle bir ifade edersem:

  1. Ruby / Python'u biliyorsun.
  2. Henüz Clojure'un avantajlarını görmüyorsunuz.
  3. Lisp veya Clojure sözdizimini temiz bulmuyorsunuz.

... bence en iyi cevap Emerick, Carper ve Grand tarafından yazılan Clojure Programlama kitabını okumaktır . Kitap Python, Ruby ve Java ile çok sayıda açık kod karşılaştırmasına sahip ve bu dillerden kodlayıcıları ele alan metin açıklamaları var. Şahsen, Python ile iyi büyüklükte projeler yaptıktan ve Lisp deneyimi yaşadıktan sonra Clojure'a geldim; Bu kitabı okumak beni Clojure'u sadece yan projelerde değil, profesyonel amaçlar için kullanmaya başlamaya ikna etti.

İki sorunuzu doğrudan ele almak için:

  1. Clojure'nin nesi iyi? Bu site ve diğer yerlerdeki birçok cevap, örneğin bkz. Https://www.quora.com/Why-would-someone-learn-Clojure
  2. Anlayabilmek için dil hakkında bilmem gereken en düşük minimum nedir? Ben hem belden olarak, Clojure tasarımı arkasındaki büyük fikirler bilerek öneririm Clojure Programlama ve Clojure Joy ESP, kitap-bilge ve Rich Hickey görüşmelerde. Konuşma Basit Kolay . Neyin / neyin / ne olduğunu öğrendikten sonra Clojure kodunu okurken , nasıl olduğunu anlamaya başlayabilirsiniz . Düşüncelerinizi sınıflardan, nesnelerden, durum / mutasyondan “sadece işlevler ve verilere” nasıl değiştirirsiniz (üst düzey işlevler, haritalar / kümeler / diziler, türler).

Ek öneriler: Lisp'in zerafeti ve gücü, kısmen minimalist ve tamamen tutarlı bir sözdiziminden kaynaklanmaktadır. Bunu iyi bir editörle, örneğin clojure modu ve ParEdit ile Emacs gibi, takdir etmek çok daha kolay. Daha yakından tanıdıkça, sözdizimi kaybolur ve anlam, niyet ve özlü soyutlamaları "görürsünüz". İkincisi, ClojureScript veya Compojure kaynağını okuyarak başlamayın, bunlar bir kerede çok fazla; Bazı 4clojure.org problemlerini deneyin ve çözümleri en iyi kodlayıcılarla karşılaştırın. Başka 4-6 çözüm görüyorsanız, her zaman birileri sakar, ayrıntılı ve gereksiz derecede karmaşık bir emir tarzı çözümle karşılaştırabileceğiniz gerçekten idiomatik, özlü bir FP tarzı bir çözüm yazmış olacaktır.


20

Lisp lehçeleri, basit sözdizimleri nedeniyle benzersiz bir yere sahiptir. Bu basit sözdizimi, makro programlama yoluyla meta programlamayı çok basit hale getirir. Bu, dili kendi sorun alanınıza uyacak şekilde modellemek yerine, sorun alanınıza uyacak şekilde modellemenizi sağlar. Kafanızı dolaştığınızda çok havalıdır ve diğer dillerde çok zor olan birçok şeyi kolayca yapmanızı sağlar.

Dezavantajı, her Lisp programının temel olarak kendi dilini tanımlamasından bu yana, neler olup bittiğini anlamak için işleri gerçekten sağlam bir şekilde kavramanız gerekir.

Şimdi, sorularınızı cevaplamak için ...

  1. Clojure, JVM / CLR'de çalışan modern bir Lisp lehçesidir. Bu, mevcut bir altyapıdaki Lisp'in gücünden yararlanmayı kolaylaştırır.

  2. Lisp'i problem alanınıza kullanmasını sağlamak için makroları nasıl kullanacağınızı anlamak esastır. Bunu yalnızca bir Lisp çalışma zamanı uyguladıktan sonra, ana dil özelliklerinin çoğunun Lisp'in kendisinde kolayca uygulanabileceğini bulduğumda anladım. Bunu elde etmek için oldukça büyük ölçekli bir proje gerekiyor.

Artıları bir yana, programlamak eğlenceli olsa da, şahsen günlük problemler için başvuracağım çok fazla vakam yok. Zihin genişletmeyi öğrenmek için çok iyi bir araçtır ve Lisp'i düzgün bir şekilde öğrendikten sonra, diğer dillerde meta programlama olanaklarından yararlanmak çok daha doğal hale geldi.

Basit sözdizimi, bilgisayarların yorumlanmasını kolaylaştırır (bu kadar güçlü makrolara izin verir), ancak bir insanın karmaşık ifadeleri hızlı bir şekilde ayrıştırmasını çok zorlaştırır.


2
Işık masasına baktın mı ?

4
Cevabınız, çoğu programlama problemi sıradan birinci sınıf fonksiyonlarla çözülebildiğinde, makroların Lisp programlamaya yaklaşmanın normal yolu gibi görünmesini sağlar. Makroların öncelikle dil programlaması için kullanılması amaçlanmıştır (dilin genişletilmesi gibi). Ayrıca bakınız bookshelf.jp/texi/onlisp/onlisp_9.html
Robert Harvey

3
@RobertHarvey Eğer marcos'un avantajlarından faydalanmıyorsanız, daha fazla okunabilir bir sözdizimine sahip birinci sınıf fonksiyonlar sunan hangi dillerin bolluğunun olduğunu savunurum.
bunglestink

@MichaelT düzgün görünüyor. Konsepti beğeniyorum.
DPM

3
@RobertHarvey Scala, JavaScript, C #, Python ve Haskell, Lisps'ten daha fazla insan tarafından ayrılabilir sözdizimi düşüneceğim birinci sınıf fonksiyonlara sahip diller kadar kafamın en üstünde.
bunglestink

10

Clojure'un güçlü yönleri birçok kez vurgulandı ve yeterince güçlü bir dil oluşturduğundan, onları burada tekrar etmeyeceğim.

Üniversiteden beri hep lisp'i sevdim ve Clojure'u keşfettiğimde gerçekten heyecanlandım (belki de lisp'i akademi dışında en sonunda kullanma şansı!). Ancak, huzursuz bir duygu öğrenmeye başladığımda, içine sürünmeye başladı, ancak tam olarak sevmediğim şeyin ne olduğunu tam olarak belirleyemiyorum. Öncelikle Common lisp'te kodlamanın benim için kolay ve eğlenceli olduğunu söyleyebilirim ama Clojure'un daha ileri bir öğrenme eğrisi var. Clisp'in belli bir güzelliği ve zarafeti vardı. Clojure'dan aynı hissi alacağımdan emin değilim. Daha fazla tecrübe kazandıkça bu hissin ortadan kalkacağını merak ediyorum.

Gizemli hafif itişim için başka bir tahminim var. Bunun büyük esnekliği olabileceğini düşünüyorum. Örneğin, yarım vektör ve yarım harita olan yapılara sahip olabilirsiniz ve birkaç kod karakteriyle bunları parametre olarak kabul edebilir, parçalara ayırabilir ve doğru şekilde işleyebilirsiniz. Evet, tüm kazan plakasını ortadan kaldırır, ancak bir şekilde doğru hissetmez. Hiç bilmediğiniz gibi parantez içindeki tüm parantezler, kolonlar, frenler vb. Kurallar geçerlidir.

Benim için hala tüm avantajları için dili seviyorum (öncelikle, JVM'de çalışmak ve eşzamanlılığı basitleştirmek, çok daha güçlü ve Java'dan daha kısa ve net bir tasarım kusuru ile) ama jüri hala bir şey olup olmadığını iyileştirilmiş olabilirdi.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.