Şemadan ne öğrenmeliyim?


10

Daha iyi bir programcı olmama yardımcı olacak Scheme'den hangi benzersiz özellikleri öğrenebileceğimi merak ediyordum.

Anaakım dillerde çok deneyimim var ve ufkumu genişletmek ve diğer dillerden eksik olan fonksiyonel yönleri öğrenmek istiyorum. Javascript, C # lambda ifadeleri kapanışları hakkında bilgi sahibiyim ve diğer dillerde eksik olan ne odaklanabilir merak ediyorum? Lisp sözdizimi dışında, şimdiye kadar gördüklerimi daha önce başka dillerde de gördüm.

Bana yeni bir şey öğretecek Şema / Lisp'e özgü olan nedir?


3
Lisp, sonunda elde ettiğinizde sahip olacağınız derin aydınlanma deneyimi için öğrenmeye değer; Bu deneyim, Lisp'in kendisini çok fazla kullanmasanız bile, gününüzün geri kalanı için sizi daha iyi bir programcı yapacaktır. - Eric Raymond
Robert Harvey


1
@Robert Harvery: Ayrıca: xkcd.com/224
Poindexter

2
Şu anki haliyle bu soru özellikle yapıcı değildir. Daha ayrıntılı bilgi istemek için yeniden çalışabiliyorsanız faydalı olabilir.
ChrisF

Ayrıca bkz. Post-Linnaean Çağında Programlama Dillerinin Öğretimi ve bu makalede atıfta bulunulan ders kitabı: Programlama Dilleri: Bir Şema lehçesi olan Racket Language kullanan Uygulama ve Yorumlama .
Robert Harvey

Yanıtlar:


7

Lisp'in belki de en önemli tanımlayıcı özelliği "Veri Olarak Kod" dur .  Bu deneyimi diğer dillerle aynı şekilde elde edemezsiniz. C # 'da, en yakın analog ifade ağaçlarıdır.

Lisp'i ayrıştırma için mükemmel bir dil yapan kalitedir. Paul Graham'ı Lisp'i söylemeye motive eden de kalite: "Lisp hakkındaki alışılmadık şey - aslında Lisp'in tanımlayıcı kalitesi - kendi başına yazılabilmesidir." Kendi kendini barındıran derleyiciler yeni bir şey olmamasına rağmen, hiçbir dil Lisp kadar zarif yapmaz.

Metaprogramlama (Lisp'in de üstün olduğu bir şey) de öğrenmeye değer bir şeydir.

Paul Graham tarafından Ortalamaları Atma
http://www.paulgraham.com/avg.html


1
Bence bu "aha!" ESR'nin bana söz verdiği an Prolog'da zaten "veri olarak kod" vahiyinin olmasıydı.
Frank Shearar

1
Haskell "veri olarak kod" özelliğine sahip mi? Yoksa güzellik büyük ölçüde dinamik yazım ve düşünmeye mi bağlı?
Joey Adams

1
@Joey: Bence Şablon Haskell var aslında Haskell "veri olarak kod" özniteliğinden yoksun demektir.
j_random_hacker

4

Evet, özyinelemeli bir şekilde düşünmenize yardımcı olacaktır. Bir programlama dil sınıfında sadece bir ay boyunca (şema) çalıştım ve programlama problemlerini nasıl düşündüğümü ve çözdüğümü geliştirmeme yardımcı oldu.

Diğer programlama paradigmalarını denemek her zaman değerlidir; daha sonra yeni fikirlerle yenilenerek OO dünyasına dönersiniz.

Sözdizimi değil, akıl yürütme, harika bir beyin egzersizi. Özyineleme ve listelerin ilginç kullanımı Appart, IMHO fazla bir şey yok, ama buna değer.


Şemaya özgü değil. Herhangi bir (iyi, neredeyse her) işlevsel dil özyineleme yapmak için iyidir.

Kabul ediyorum, ancak OP, 'ana akım' dillere kıyasla Şema ile ilgileniyor gibi görünüyor ....
Xavier Nodet

1

Devamı :

Bilgisayar bilimi ve programlamasında devam, bir bilgisayar programının kontrol durumunun soyut bir temsilidir. Bir devam, program kontrol durumunu ilişkilendirir, yani devam, işlemin yürütülmesinde belirli bir noktada hesaplama işlemini temsil eden bir veri yapısıdır; oluşturulan veri yapısına, çalışma zamanı ortamında gizlenmek yerine programlama dili ile erişilebilir. İşlemin 'geçerli yığını (kullanım ömrü süreç içinde olan tüm veriler dahil, örneğin "yerel değişkenler") ve hesaplamadaki işlem' noktası gibi bilgileri içerir. Bir devam örneği daha sonra bir kontrol yapısı olarak kullanılabilir; çağırma üzerine yürütmeyi temsil ettiği kontrol noktasından devam ettirir. "Mevcut devam"

ve sonra McCarthy'nin Belirsiz Operatörünü uygulamaya çalışın :

1963'te Lisp'in mucidi John McCarthy, işlevi (bilgisayar programı anlamında) amb (.,.) Önerdiği bir Matematiksel Hesaplama Teorisi için bir Temel hazırladı. Fikir şu ki amb (x, y) ilk önce x'e eşittir. Fakat daha sonra hesaplamada bunun bir tür çelişkiye yol açtığı tespit edilirse, x değeri geri çekilir ve y ile değiştirilir. Bu, ilk bakışta göründüğünden çok daha karmaşık bir iş. Bir değeri geri çekmek, esas olarak, hesaplamanın tüm durumunu, amb x değerini döndürdüğü yere geri döndürmek ve sonra y değerinde kaymak anlamına gelir. Bu, x ilk kez döndürüldüğünde tüm durumun bir şekilde dondurulması ve kopyalanması anlamına gelir. Bir çelişki bulunduğunda, programın tüm durumu atılır ve yerine yeniden etkinleştirilen dondurulmuş sürüm kullanılır. Bu donmuş durumlar devam olarak bilinir. Birçok yönden asit üzerine bir GOTO ifadesi gibidir. Kodunuzda isteğe bağlı bir noktaya atlamaya neden olabilir. Ancak devamlar GOTO'lardan daha iyidir, çünkü mantıksal akıl yürütmeye daha uygundurlar.


1

Aşağıdakileri düşünebilirim:

  • Gerçek makrolar (kod oluşturmak için dilin tüm gücünü kullanarak)
  • Homoiconicity (kod olarak veri, veri olarak kod)
  • Tembel değerlendirme
  • continuations

Ayrıca lisp dillerinin alana özgü dilleri (DSL) tanımlamak için harika olması gerektiğini düşünüyorum. Zaten bilmiyorsanız, okumak isteyebileceğiniz bir şeydir.

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.