Eksileri - cons

Olarak bilgisayar programlama , cons( / k ɒ n z / veya / k ɒ n s / ) temel olan işlevi en ağızlarında Lisp programlama dili . cons cons tructs değerlerine iki değer veya işaretçileri sahip bellek nesneleri. Bu nesnelere (eksileri) hücreler, eksiler, atomik olmayan s-ifadeleri ("NATSe'ler") veya (eksileri) çiftleri olarak atıfta bulunulur . Lisp jargonunda şekilde, "cons x üzerine y ile yeni bir nesne oluşturmak için araçlar" . Ortaya çıkan çiftin sol yarısı (ilk eleman veya kaydın adres bölümünün içeriği ) ve sağ yarısı (ikinci eleman veya kaydın azalma kısmının içeriği ) olarak adlandırılan bir sol yarısı vardır . . (cons x y)carcdr

Bu, argümanlar verilen yeni bir nesne yaratan nesne yönelimli bir yapıcı kavramıyla gevşek bir şekilde ilişkilidir ve daha çok cebirsel bir veri türü sisteminin yapıcı işleviyle yakından ilgilidir .

"Eksiler" kelimesi ve "eksiler" gibi ifadeler de daha genel bir işlevsel programlama jargonunun parçasıdır . Bazen , özellikle liste işleme bağlamında benzer bir amacı olan operatörler "eksiler" olarak telaffuz edilir. (İyi bir örnek ::olarak operatör ML , Scala , F # ve Elm veya :operatör Haskell'e bir liste başında bir öğe ekleyen.)

Kullanmak

Eksi hücreler sıralı veri çiftlerini tutmak için kullanılabilse de, daha yaygın olarak daha karmaşık bileşik veri yapıları, özellikle listeler ve ikili ağaçlar oluşturmak için kullanılırlar .

sıralı çiftler

Örneğin, Lisp ifadesi , sol yarısında (alan olarak adlandırılan ) 1 ve sağ yarısında ( alan) 2 tutan bir hücre oluşturur . Lisp notasyonunda değer şöyle görünür: (cons 1 2)carcdr(cons 1 2)

(1 . 2)

1 ile 2 arasındaki noktaya dikkat edin; bu, S ifadesinin bir "liste" yerine "noktalı bir çift" ("eksiler çifti" olarak adlandırılan) olduğunu gösterir.

Listeler

Liste (42 69 613) için eksi hücre diyagramı, şununla yazılmıştır cons:
(cons 42 (cons 69 (cons 613 nil)))
ve şununla yazılır list:
(list 42 69 613)

Lisp'te listeler, eksiler çiftlerinin üstüne uygulanır. Daha spesifik olarak, Lisp'teki herhangi bir liste yapısı aşağıdakilerden biridir:

  1. ()Genellikle denilen özel bir nesne olan boş bir liste nil.
  2. carListenin ilk öğesi olan cdrve geri kalan öğeleri içeren bir liste olan bir eksiler hücresi .

Bu , içeriği , , ve ile değiştirilebilen basit, tek başına bağlantılı bir liste yapısının temelini oluşturur . Not ayrıca eksileri çifti olmayan tek listedir. Örnek olarak, öğeleri 1, 2 ve 3 olan bir listeyi ele alalım. Böyle bir liste üç adımda oluşturulabilir: conscarcdrnil

  1. Eksileri 3 nil, boş liste
  2. Sonuç üzerine Eksileri 2
  3. Sonuç üzerine Eksileri 1

hangi tek ifadeye eşdeğerdir:

(cons 1 (cons 2 (cons 3 nil)))

veya onun kısaltması:

(list 1 2 3)

Ortaya çıkan değer listedir:

(1 . (2 . (3 . nil)))

yani

 *--*--*--nil
 |  |  |
 1  2  3

genellikle şu şekilde kısaltılır:

(1 2 3)

Böylece, consmevcut bir bağlantılı listenin önüne bir eleman eklemek için kullanılabilir. Örneğin, yukarıda tanımladığımız liste x ise, listeyi üretecektir: (cons 5 x)

(5 1 2 3)

Yararlı başka bir liste işlemdir appendki, birleştirir , mevcut iki listelerini (yani tek bir liste halinde iki listelerini birleştirir).

Ağaçlar

Yalnızca yapraklarında veri depolayan ikili ağaçlar da kolayca oluşturulabilir cons. Örneğin, kod:

(cons (cons 1 2) (cons 3 4))

ağaçtaki sonuçlar:

((1 . 2) . (3 . 4))

yani

   *
  / \
 *   *
/ \ / \
1 2 3 4

Teknik olarak, önceki örnekteki liste (1 2 3) aynı zamanda özellikle dengesiz olan bir ikili ağaçtır. Bunu görmek için diyagramı yeniden düzenlemeniz yeterlidir:

 *--*--*--nil
 |  |  |
 1  2  3

aşağıdaki eşdeğere:

   *
  / \
 1   *
    / \
   2   *
      / \
     3  nil

Konuşmada kullanın

Eksileri, zorunlu bir programlama dilinde kullanılacak türden yıkıcı işlemleri kullanmak yerine , genel bellek ayırma işlemine atıfta bulunabilir . Örneğin:

Saçma bir şekilde eksilerini almak yerine yan etkiler koyarak kodu biraz hızlandırdım .

İşlevsel uygulama

Lisp birinci sınıf fonksiyonlara sahip olduğundan , eksiler hücreleri de dahil olmak üzere tüm veri yapıları fonksiyonlar kullanılarak gerçekleştirilebilir. Örneğin, Şemada :

(define (cons x y)
  (lambda (m) (m x y)))
(define (car z)
  (z (lambda (p q) p)))
(define (cdr z)
  (z (lambda (p q) q)))

Bu teknik, Kilise kodlaması olarak bilinir . "Eksiler hücresi" olarak bir işlevi kullanarak eksilerini , araba ve cdr işlemlerini yeniden uygular . Kilise kodlaması, Scheme ile yakından ilişkili soyut, teorik bir hesaplama modeli olan saf lambda hesabındaki veri yapılarını tanımlamanın olağan bir yoludur .

Bu uygulama, akademik açıdan ilginç olmakla birlikte, eksi hücrelerini diğer herhangi bir Scheme prosedüründen ayırt edilemez kıldığı ve ayrıca gereksiz hesaplama verimsizlikleri getirdiği için pratik değildir.

Bununla birlikte, aynı tür kodlama, varyantları olan daha karmaşık cebirsel veri türleri için kullanılabilir ve burada, diğer kodlama türlerinden daha verimli olduğu ortaya çıkabilir. Bu kodlamanın ayrıca Java gibi değişkenleri olmayan statik olarak yazılmış bir dilde , lambdalar yerine arabirimler kullanılarak uygulanabilir olma avantajı vardır .

Ayrıca bakınız

Referanslar

  1. ^ "Arşivlenmiş kopya" (PDF) . Orijinalinden (PDF) 2010-03-31 tarihinde arşivlendi . 2009-03-01 alındı .CS1 bakımı: başlık olarak arşivlenmiş kopya ( bağlantı )

Dış bağlantılar

  • SDRAW , Common Lisp kodu çizim için hücre yapılarının eksilerini çizer. David S. Touretzky'den.