Ortak Lisp Nesne Sistemi - Common Lisp Object System

ANSI ortak lisp'te standart yöntem kombinasyonu

Ortak Lisp Nesne Sistemi (CLOS) tesis için mi nesne yönelimli programlama hangisinin parçası ANSI Ortak Lisp. CLOS güçlüdür dinamik Daha fazla yerde bulunan OOP tesislerinden kökten farklı olan nesne sistemi statik diller gibi C ++ veya Java. CLOS, daha önceki Lisp nesne sistemlerinden esinlenmiştir. MIT Lezzetleri ve Yaygın Döngüler her ikisinden de daha genel olmasına rağmen. Başlangıçta bir eklenti olarak önerilen CLOS, Common Lisp için ANSI standardının bir parçası olarak benimsenmiştir ve diğer Lisp lehçelerine uyarlanmıştır. EuLisp veya Emacs Lisp.[1]

Özellikleri

CLOS'un temel yapı taşları şunlardır: sınıflar ve onların yöntemler, bu sınıfların örnekleri ve genel işlevler.CLOS şunları tanımlamak için makrolar sağlar: defclass, defme yöntemi, ve defgenerik. Örnekler yöntemle oluşturulur örnek oluşturmak.

Sınıflar birden fazla üst sınıflar, bir yuva listesi (C ++ / Java dilinde üye değişkenler) ve özel bir metasınıf. Yuvalar, sınıfa (bir sınıfın tüm örnekleri yuvayı paylaşır) veya örneğe göre tahsis edilebilir. Her yuvanın bir adı vardır ve bir yuvanın değerine bu adla işlevi kullanılarak erişilebilir yuva değeri. Ayrıca slotların değerlerini yazmak veya okumak için özel jenerik fonksiyonlar tanımlanabilir. CLOS sınıfındaki her yuvanın benzersiz bir adı olmalıdır.

CLOS bir çoklu gönderim sistemi. Bu şu demek yöntemler gerekli argümanlarından herhangi biri veya tümü üzerinde uzmanlaşabilir. Çoğu OO dili tek gönderimdir, yani yöntemlerin yalnızca ilk argüman üzerinde uzmanlaştığı anlamına gelir. Bir başka alışılmadık özellik de, yöntemlerin sınıflara "ait" olmamasıdır; sınıflar, genel işlevler veya yöntemler için bir ad alanı sağlamaz. Yöntemler sınıflardan ayrı olarak tanımlanır ve sınıf alanlarına özel erişimleri (ör. "Bu", "öz" veya "korumalı") yoktur.

CLOS'taki yöntemler şu şekilde gruplanır: genel işlevler. Genel bir işlev, bir işlev gibi çağrılabilen ve her biri farklı argümanlar için özelleştirilmiş, paylaşılan bir ad ve argüman yapısıyla bir yöntemler koleksiyonunu ilişkilendiren bir nesnedir. Common Lisp yapılar ve yerleşik veri türleri (sayılar, dizeler, karakterler, semboller, ...) için CLOS olmayan sınıflar sağladığından, CLOS dağıtımı bu CLOS dışı sınıflarla da çalışır. CLOS ayrıca tek tek nesneler (eql uzmanları) üzerinden gönderimi destekler. CLOS, varsayılan olarak tüm Common Lisp veri türleri üzerinden gönderimi desteklemez (örneğin, gönderme, tamamen özelleştirilmiş dizi türleri veya deftype). Ancak, Common Lisp uygulamalarının çoğu bir meta nesne protokolü bu, genel işlevlerin uygulamaya özel uzmanlaşma ve dağıtım kuralları sağlamasına izin verir.

CLOS'ta gönderim de çoğu OO dilinden farklıdır:

  1. Bir argüman listesi verildiğinde, uygulanabilir yöntemlerin bir listesi belirlenir.
  2. Bu liste, parametre uzmanlarının özgüllüğüne göre sıralanır.
  3. Bu listeden seçilen yöntemler daha sonra genel işlev tarafından kullanılan yöntem kombinasyonu kullanılarak etkili bir yöntemde birleştirilir.
  4. Etkili yöntem daha sonra orijinal argümanlarla çağrılır.

Bu gönderme mekanizması çalışma zamanında çalışır. Yöntemlerin eklenmesi veya kaldırılması, çalışma zamanında değişen etkili yöntemlere (genel işlev aynı bağımsız değişkenlerle çağrıldığında bile) yol açabilir. Yöntem kombinasyonunun değiştirilmesi de farklı etkili yöntemlere yol açabilir.

Örneğin,

; ortak argüman yapısı prototipini bildirmek(defgenerik f (x y)); (f tamsayı t) için bir uygulama tanımlayın, burada t tüm türlerle eşleşir(defme yöntemi f ((x tamsayı) y) 1)(f 1 2.0) => 1; (f tamsayı gerçek) için bir uygulama tanımlayın(defme yöntemi f ((x tamsayı) (y gerçek)) 2)(f 1 2.0) => 2 ; çalışma zamanında gönderim değişti

Çoğu OO sistemleri gibi dinamik diller, CLOS zorlamaz kapsülleme. Herhangi bir yuvaya şu kullanılarak erişilebilir: yuva değeri işlev veya aracılığıyla (isteğe bağlı olarak otomatik oluşturulur) erişimci yöntemleri. Erişim için yuva değeri yuvanın adını bilmeniz gerekir. CL programcıları, dilin paket hangi işlevlerin veya veri yapılarının ihracat için tasarlandığını beyan etme olanağı.

Normal ("birincil") yöntemlerin yanı sıra, ayrıca :önce, :sonra, ve :etrafında "yardımcı" yöntemler. İlk ikisi, sınıf hiyerarşisine göre belirli bir sırada birincil yöntemden önce veya sonra çağrılır. Bir :etrafında yöntem, birincil yöntemin çalıştırılıp çalıştırılmadığını kontrol edebilir. Ek olarak, programcı program boyunca olası tüm birincil yöntemlerin sınıf hiyerarşisi veya sadece en yakın eşleşmeyi sağlayan kişi çağrılmalıdır.

Standart Yöntem-Kombinasyon yukarıda açıklanan birincil, öncesi, sonrası ve çevresinde yöntemleri sağlar. Diğer yöntem türleri ile başka Yöntem Kombinasyonları vardır. Yeni (hem basit hem de karmaşık) Yöntem Kombinasyonları ve yöntem türleri tanımlanabilir.

CLOS izin verir çoklu miras. Yöntemlerin çoklu devralmada yürütüldüğü varsayılan sıra doğru olmadığında, programcı elmas kalıtım sorunları yöntem kombinasyonlarının sırasını belirterek.

CLOS dinamiktir, yani yalnızca içerik değil, aynı zamanda yapı nesnelerinin tanesi çalışma zamanında değiştirilebilir. CLOS, sınıf tanımlarını anında değiştirmeyi (söz konusu sınıfın örnekleri zaten mevcut olsa bile) ve belirli bir örneğin sınıf üyeliğini değişim sınıfı Şebeke. CLOS ayrıca çalışma zamanında yöntemlerin eklenmesine, yeniden tanımlanmasına ve kaldırılmasına izin verir. Daire Elips Problemi CLOS'ta kolayca çözülür ve çoğu OOP tasarım desenleri ya kaybolur ya da niteliksel olarak daha basittir.[2]

CLOS bir prototip dili: Nesnelerin o sınıfın üyeleri olarak somutlaştırılabilmesi için önce sınıfların tanımlanması gerekir.

Metaobject Protokolü

ANSI Common Lisp standardının dışında, CLOS için yaygın olarak uygulanan bir uzantı vardır: Metaobject Protokol (MOP). MOP, CLOS uygulamasının temelleri için standart bir arabirim tanımlar, sınıfları, yuva tanımlarını, genel işlevleri ve yöntemleri, metasınıflar, ve yeni meta sınıfların tanımlanmasına ve tüm CLOS davranışının değiştirilmesine izin verir. CLOS MOP prefigürlerinin esnekliği bakış açısına yönelik programlama, daha sonra aynı mühendislerden bazıları tarafından geliştirilen Gregor Kiczales. MOP, tüm nesne sisteminin davranışını bir dizi protokol ile tanımlar. Bunlar CLOS açısından tanımlanmıştır. Böylece, sağlanan CLOS işlevselliğini genişleterek veya değiştirerek yeni nesne sistemleri oluşturmak mümkündür. Kitap Metaobject Protokolünün Sanatı CLOS MOP'un kullanımını ve uygulanmasını açıklar.

Çeşitli Common Lisp uygulamaları, Meta Nesne Protokolü için biraz farklı desteğe sahiptir. Daha yakın[3] proje eksik özellikleri sağlamayı amaçlamaktadır.

Eski Lisp tabanlı nesne sistemlerinden gelen etkiler

Tatlar (ve onun halefi New Flavors) MIT'deki nesne sistemiydi Lisp Makinesi. Lisp Machine işletim sistemlerinin büyük parçaları ve bunun için birçok uygulama Flavours veya New Flavours kullanır. Tanıtılan tatlar çoklu miras ve Mixins, diğer özelliklerin yanı sıra. Common Lisp uygulamaları mevcut olsa da, tatlar çoğunlukla modası geçmiş durumdadır. Flavors, mesaj geçirme paradigmasını kullanıyordu. New Flavours, jenerik işlevleri tanıttı.

Yaygın Döngüler LOOPS'un halefiydi (Xerox'tan Interlisp -D). CommonLoops, Common Lisp için uygulandı. CLOS'un ilk uygulaması Taşınabilir CommonLoops (PCL) adlı taşınabilir bir uygulama idi. PCL, geniş çapta taşınmaktadır ve hala birkaç uygulamanın CLOS uygulaması için temel sağlar. Ortak Lisp uygulamalar. PCL, çoğunlukla, yalnızca birkaç sisteme bağlı parça ile taşınabilir Common Lisp'de uygulanır.

Diğer programlama dillerinde CLOS

CLOS'un gücü ve ifade gücünün yanı sıra TinyCLOS'un (basitleştirilmiş bir taşınabilir CLOS uygulaması) Gregor Kiczales Scheme ile kullanım için), CLOS benzeri MOP tabanlı nesne sistemleri, fiili Çoğu Lisp lehçesi uygulamasında norm ve diğer bazı dillerde kendi yollarını bulmanın yanı sıra OOP tesisler:

[6]

Referanslar

  1. ^ "CLOS bir standarttır. Birden çok satıcı CLOS sağlar. CLOS (veya bir kısmı), EuLisp veya Emacs Lisp gibi diğer Lisp lehçelerine nesne yönelimi eklemek için kullanılmaktadır." s. 110 Veitch 1998
  2. ^ İçinde Dinamik Dillerde Tasarım Desenleri Peter Norvig, çeşitli ders kitaplarından alınan 23 tasarım modelinden 16'sının Dylan veya Common Lisp'de C ++ 'ya göre "görünmez veya daha basit" olduğuna dair bulgularını sunuyor.
  3. ^ Yakın Proje: MOP'a Daha Yakın
  4. ^ COS, C Nesne Sistemi
  5. ^ VCLOS, Beceri için CLOS
  6. ^ Gregor Kiczales tarafından geliştirilen Tiny CLOS
  • "CommonLoops: Lisp ile nesne yönelimli programlamayı birleştirme ", Daniel G. Bobrow, Kenneth Kahn, Gregor Kiczales, Larry Masinter, Mark Stefik, Frank Zdybel. 1986, Portland, Oregon, Amerika Birleşik Devletleri. Sayfa 17-29, Nesneye Dayalı Programlama Sistemleri Dilleri ve Uygulamaları Konferansı, ISSN 0362-1340.
  • Jim Veitch tarafından "CLOS'un Tarihçesi ve Açıklaması". Sayfa 107–158 / Programlama Dilleri El Kitabı, Cilt IV: İşlevsel ve Mantıksal Programlama Dilleri, ed. Peter H. Salus. 1998 (1. baskı), Macmillan Teknik Yayıncılık; ISBN  1-57870-011-6

Edebiyat