Ne kadar LISP makroları gidebilir?

oy
43

Ben LISP muhtemelen makrolarıyla anında sözdizimi yeniden tanımlayabilirsiniz çok okudum. Ben ne kadar bu aslında gidiyor merak ediyorum? Eğer sınırda başka bir dil için bir derleyici hale geleceği kadar dil yapısını yeniden tanımlamak miyim? Örneğin, bir daha nesne yönelimli sentaks ve semantik LISP'in işlevsel doğasını değiştirebilir, belki Ruby gibi bir şey daha yakın sözdizimi sahip söylemek?

Özellikle, bu makroları kullanarak parantez cehennem kurtulmak mümkün mü? Kendi mikro özellikleri ile Emacs özelleştirmek için yeterli (Emacs-) LISP'i öğrendik ama uzak makrolar dili özelleştirme gitmek ne kadar çok merak ediyorum.

Oluştur 05/08/2008 saat 08:32
kaynak kullanıcı
Diğer dillerde...                            


14 cevaplar

oy
33

Bu gerçekten iyi bir soru.

Bunun incelikli ama kesinlikle sorumlu olduğunu düşünüyorum:

Makro s-ifadelerde sıkışmış değildir. anahtar kelimeler (semboller) kullanılarak yazılmış çok karmaşık bir dil için DÖNGÜ makro bakın. Yani, başlayabilir ederken ve kendi sözdizimi vardır içinde parantez ile döngü sonunda.

Örnek:

(loop for x from 0 below 100
      when (even x)
      collect x)

Söyleniyor, en basit makrolar sadece s-ifadeler kullanır. Ve bunları kullanmaya "sıkışmış" olurdu.

Ama s-ifadeler, Sergio Yanıtladı gibi sağ hissetmeye başlar. sözdizimi dışına alır ve sözdizimi ağacındaki kodlama başlar.

okuyucu makrolar gelince, evet, makul böyle bir şey yazabilirsiniz:

#R{
      ruby.code.goes.here
  }

Ama kendi Yakut sözdizimi ayrıştırıcı iletişim kurmanız gerekir.

Ayrıca Ruby bazı mevcut Lisp yapılara derlemek makrolarıyla, bloklar gibi, yapıları taklit edebilir.

#B(some lisp (code goes here))

da uyarlanabilir

(lambda () (some lisp (code goes here)))

Bkz bu sayfayı nasıl yapılacağını için.

Cevap 15/09/2008 saat 16:07
kaynak kullanıcı

oy
20

Lisp bir derleyici olması için Evet, sözdizimi yeniden tanımlayabilirsiniz. Bu muhtemelen düşünüyoruz normal "Derleyici Makrolar" farklıdır "Okuyucu Makroları," seçeneğini kullanarak yoktur.

Common Lisp okuyucu ve okuyucu makrolar bu sözdizimi işlemek için yeni sözdizimi tanımlama yerleşik tesisi bulunmaktadır. Bu işlem (daha önce derleme veya eval zaman geliyor ki) salt anda yapılır. Common Lisp okuyucu makrolar tanımlama hakkında daha fazla bilgi edinmek için Ortak Lisp HyperSpec bakınız - okumak isteyeceksiniz Ch. 2, "Sözdizimi" ve Ch. 23 "Okuyucu" . (Ben Şema aynı tesiste olduğuna inanıyoruz, ama onunla kadar aşina değilim - bakınız Şema kaynakları için Ark programlama dili ).

Basit bir örnek olarak, Lisp küme parantezi yerine parantez kullanmak istiyorum varsayalım. Bu aşağıdaki okuyucu tanımları gibi bir şey gerektirir:

;; { and } become list delimiters, along with ( and ).
(set-syntax-from-char #\{ #\( )
(defun lcurly-brace-reader (stream inchar) ; this was way too easy to do.
  (declare (ignore inchar))
  (read-delimited-list #\} stream t))
(set-macro-character #\{ #'lcurly-brace-reader)

(set-macro-character #\} (get-macro-character #\) ))
(set-syntax-from-char #\} #\) )

;; un-lisp -- make parens meaningless
(set-syntax-from-char #\) #\] ) ; ( and ) become normal braces
(set-syntax-from-char #\( #\[ )

Sen {bir gibidir (ve bu} o Lisp'i söylüyorsun bir gibidir). Sonra bir işlev (yaratmak lcurly-brace-readerbir {gördüğü zaman) okuyucu arayacak ve kullanmak set-macro-characteriçin bu işlevi {atamak. Sonra o (ve) [ve] (yani, değil anlamlı sözdizimi) gibi Lisp söyle.

Diğer şeyler, örneğin şunları yapabileceği yeni bir dize sözdizimi oluşturarak ya da in-düzeltme notasyonu içine ve S-ifadeleri içine işlemek için kullanan [ve].

Ayrıca okuyucuda eylemleri tetikleyecek kendi makro karakterlerle tüm sözdizimi yeniden tanımlanması, bu ötesine gidebilir, bu nedenle gökyüzü gerçekten sınırıdır. Bu sadece nedenlerinden biridir Paul Graham'ın ve diğerleri Lisp bir derleyici yazmak için iyi bir dil olduğunu söyleyip duruyorsun.

Cevap 16/09/2008 saat 20:28
kaynak kullanıcı

oy
16

Ben halt Hatta Lisp programcı değilim, ama dilin deneme biraz sonra ben bir süre sonra parantez 'görünmez' hale başlar sonucuna vardı ve kodu olarak görmeye başlamak, bir Lisp uzman değilim Ne olmasını istiyorum. Eğer s-exprs ve makrolar yoluyla oluşturmak sözdizimsel yapılara daha fazla dikkat başlamak ve listeleri ve parantez metninin sözcük formuna az.

Eğer girinti ve sözdizimi renklendirme ile yardımcı olan bir iyi editör yararlanmak (arka çok benzeyen bir renge parantez ayarlamayı deneyin), bu özel doğrudur.

Tamamen dili değiştirmek ve 'Ruby' sözdizimi almak mümkün olmayabilir, ama bunu gerekmez. İstersen sen 'programlama Yakut stilini' takip ediyor gibi hissediyor bir lehçesini sahip bitebileceğini dil esnekliği sayesinde, bu sana ne demektir.

Bu sadece ampirik gözlem olduğunu biliyorum, ama bu fark edince O Lisp aydınlanma anlarından birini olduğunu düşünüyorum.

Cevap 26/08/2008 saat 10:49
kaynak kullanıcı

oy
15

Tekrar tekrar, Lisp için yeni gelenler "Tüm parantez kurtulmak." Istiyorum Bir kaç hafta sürer. programcılar değişmez şu anda olarak gördüğü tercih rüzgar nedeniyle olağan S-ifadesi ayrıştırıcı üstünde ciddi bir genel amaçlı programlama sözdizimi inşa etmek hiçbir proje şimdiye kadar, her yerde olur "parantez cehenneme." Bu bir alışmak biraz, ama çok değil alır! Eğer buna alışması yoktur ve gerçekten, varsayılan sözdizimi plastisite takdir belli bir programlama yapısını ifade etmenin tek bir yolu olduğu yerde dillere geri dönüyor olabilir kez gerçekten ızgara olduğunu.

Söyleniyor, Lisp Domain Specific Diller bina için mükemmel bir ortamdır. Hemen kadar iyi değilse, XML daha iyi.

İyi şanslar!

Cevap 16/09/2008 saat 20:29
kaynak kullanıcı

oy
12

Gördüğüm Lisp makro iyi açıklamanın altındadır

https://www.youtube.com/watch?v=4NO83wZVT0A

içinde yaklaşık 55 dakika başlayan. Bu alanda en iyi Lisp ders kitabı olan Peter Seibel, "Pratik Common Lisp" yazarı, tarafından verilen bir konuşmanın bir video.

Gerçekten basit bir öğretici içinde sunmak için çok uzun olduğu durumlarda kendi girer çünkü Lisp makro motivasyon, açıklamak genellikle zordur. Peter büyük bir örnek ile geliyor; Süreyi tamamen kavrayabilir ve bu Lisp makro iyi, doğru kullanımını kolaylaştırır.

Sen sordu: "Eğer daha nesne yönelimli sentaks ve semantik LISP'in işlevsel doğasını değiştirebilir". Cevap Evet. Aslında, Lisp aslen hiç bir nesne yönelimli programlama yoktu, Lisp beri şaşırtıcı nesne yönelimli programlama önce yol yana civarında olmuştur değil! Biz ilk 1978 yılında OOP öğrendik ..en, diğer şeyler arasında, kullanarak, kolayca lisp için makro eklemek başardık. Sonunda Common Lisp Object Sistemi (CLOS) Lisp içine zarif uyan çok güçlü nesne yönelimli programlama sistemi geliştirildi. Her şey bir uzantısı olarak yüklenebilir - hiçbir şey yapılı-! Her makrolarıyla bitti.

Lisp dili yüzey sözdizimini genişletmek için kullanılabilir "Okuyucu makro" olarak adlandırılan, tamamen farklı bir özellik, yer alır. okuyucu makroları kullanarak, C-benzeri veya Yakut benzeri sözdizimine sahip Sublanguages ​​yapabilirsiniz. Bunlar içten, Lisp metin dönüşümü. Bu yeni sözdizimi anlamak için interaktif bir geliştirme ortamı genişletmek için zor başlıca nedeni, en gerçek Lisp programcılar tarafından yaygın olarak kullanılmaz. Örneğin, Emacs girinti komutları yeni sözdizimi ile karıştırılmamalıdır olacaktır. Eğer enerjik olsa, Emacs çok genişletilebilir olduğunu ve yeni sözcük sözdizimi hakkında öğretmeye başladı.

Cevap 05/10/2008 saat 16:03
kaynak kullanıcı

oy
11

Düzenli makro nesnelerin listelerinde çalışırlar. En yaygın olarak, bu nesnelerin diğer listeler (böylece şekillendirme ağaçlar) ve semboller, ancak bu Bu yapılar olarak adlandırılır vb ipler, hashtables, kullanıcı tanımlı nesneler gibi diğer nesneler olabilir s-EXPS .

Bir kaynak dosyasını yüklediğinizde Yani, sizin Lisp derleyici metin ayrıştırmak ve s-EXPS üretecek. Makrolar bu işler. Bu harika çalışıyor ve s-EXP ruhuna uygun bir dil uzatmak için muhteşem bir yoldur.

Bunun yanında söz konusu ayrıştırma işlemi size derleyici s-EXPS metin döner şekilde özelleştirmesine olanak tanıyan "okuyucu makrolar" yoluyla uzatılabilir. Ben başka bir şeye katlanmasını yerine Lisp'in sözdizimi benimsemesi olduğunu da göstermektedir.

Eğer Lisp'in "işlevsel doğa" ve Ruby'nin "nesne yönelimli sözdizimi" söz zaman biraz karışık gelebilir. Ben "nesne yönelimli sözdizimi" olması gerekiyordu emin değilim ama Lisp çok paradigma dildir ve o nesne yönelimli programlama destekler Extremelly iyi.

Ben Lisp'i deyince BTW, yani Common Lisp .

Sana uzak önyargılarını koymak ve önermek Lisp dürüst bir gitmek vermek .

Cevap 26/08/2008 saat 10:36
kaynak kullanıcı

oy
9

Ne soruyorsun biraz favori çikolatalı kek gelen tüm bu cehennemi kahverengi şeyler kaldırmak, böylece bir uzman çikolata olunacağı sormak gibi.

Cevap 17/09/2008 saat 13:14
kaynak kullanıcı

oy
9

Parantez oluyor? Ben artık parantezi içinde bakın:

(function toto)

olduğundan:

function(toto);

Ve

(if tata (toto)
  (titi)
  (tutu))

daha fazla:

if (tata)
  toto();
else
{
  titi();
  tutu();
}

Daha az parantez görmek ';' gerçi.

Cevap 16/09/2008 saat 17:23
kaynak kullanıcı

oy
6

Evet, temelde sözdizimi değiştirebilir ve hatta "parantezler cehennem" kaçabilir. Bunun için yeni bir okuyucu sözdizimi tanımlamak gerekir. okuyucu makrolar içine bak.

Ben ancak bu sen artık "cehennem" Parenthese ele alacağız böyle bir ölçüde dilde kendinizi gerekecektir tür makro programlamak Lisp uzmanlık seviyesine ulaşmak için şüpheli yok. Eğer bunları önlemek için nasıl zaman yani, iyi bir şey olarak bunları kabul içerisine girecek.

Cevap 15/09/2008 saat 13:07
kaynak kullanıcı

oy
2

okuyucu makrolar XML çiftleşmiş gibi karmaşık görevler lisp okuyucuyu uzatabilirsiniz nasıl bu örneğe bakın:

http://common-lisp.net/project/cl-quasi-quote/present-class.html

Bu kullanıcı kütüphanesi ağ akışı içine yazma-sequence'd hazırdır derleme zamanında UTF-8 kodlu değişmez bayt dizileri içine XML statik parçaları derler. ve onlar diktir normal lisp makroları kullanılabilen ... parçaları sabittir ve virgül karakteri etkilerin yerleştirme zamanında değerlendirilmelidir.

: mevcut daha fazla detay http://common-lisp.net/project/cl-quasi-quote/

Başka bir proje olduğunu Common Lisp sözdizimi uzantıları için: http://common-lisp.net/project/cl-syntax-sugar/

Cevap 17/09/2008 saat 01:30
kaynak kullanıcı

oy
2

İsterseniz lisp Ruby kullanan Ruby gibi görünmek.

O bu kadar çabuk kabul kazanmıştır ana nedenlerinden biri olan çok lisp gibi bir şekilde Ruby (ve Python) kullanmak mümkündür.

Cevap 05/08/2008 saat 08:40
kaynak kullanıcı

oy
1

aklımı başımdan makro kullanımlarından biri DB karşı SQL istekleri derleme zamanı doğrulama oldu.

Eğer derleme zamanında el altında tam bir dil var farkında sonra, ilginç yeni perspektifler açıyor. Hangi ayrıca (çok kolay bir hata ayıklama kabusa dönüşebilir tekrarlanabilir değil derleme render gibi) ilginç yeni yöntemlerle kendinize tekme anlamına gelir.

Cevap 19/09/2008 saat 11:43
kaynak kullanıcı

oy
1

Bu hileli bir soru. lisp zaten bir ayrıştırma ağaca yapısal olarak çok yakın olduğu için büyük bir makro sayısı ve bir ayrıştırıcı jeneratör kendi mini dili uygulanması arasındaki fark çok açık değildir. Ama, açılış ve kapanış parantez dışında çok kolay lisp hiç benzemiyor şey ile sonuçlanabilir.

Cevap 06/08/2008 saat 13:14
kaynak kullanıcı

oy
1

@sparkes

Bazen LISP Anlaşılır bir dil seçimi, yani Emacs uzantıları. Ben istedim, ama Emacs LISP ile uzatılabilir üzere almışsa Emacs uzatmak için Ruby kullanabilirsiniz eminim, yüzden anlamda bu durumda kullanmak için yapmak gibi görünüyor.

Cevap 05/08/2008 saat 08:45
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more