2010-11-19 29 views
2

LISP beni yine zorluyor ... Neden bir listedeki son elemanın değerini alamıyorum? Bir liste buna benzer kurdunuz:LISP arabası?

Şimdi
(setq bar '(((1 2) 3 4 5)((6 7) 8 9 10))) 

Ben 4 kişilik bir dönüş olsun:

(cdddar bar) 

:

(caddar bar) 

(5) için bir dönüş yoktur Ama ben bunun için 5 tane alamıyorum:

Neden böyle? d 5'in değerini nasıl alabilirim?

Hata:

; Warning: This function is undefined: 
; CADDDAR 

Error in KERNEL:%COERCE-TO-FUNCTION: the function CADDDAR is undefined. 
[Condition of type UNDEFINED-FUNCTION] 

cevap

8

5 veya daha fazla a'nın ve d'nin işlevleri tanımlanmamıştır. Sadece 4 ve daha az. Pratik olması için bu uzunluğun çok fazla olası fonksiyonu var. You have

sadece heceleyerek: (car (cdr (cdr (cdr (cdr (car x))))))

+0

Cevap: (araba (cdddar lst)) .... şimdi neden bu! = Cadddar, anlamıyorum. – toast

+2

LISP uygulamanızın bağırsaklarının derinliklerinde bir yer: (defun cadr (x) ...) (defun cdar (x) ...) (defun caar (x) ...) (defun cddr (x) ...) ve benzerleri 1 ile 4 arasındaki uzunluktaki 'a' ve 'd' kombinasyonları için. Çok fazla olduğu için, özellik 5 uzunluğunu içermez. # 'Cdadr ailesi işlevleri hakkında özel bir şey yok. Benzersiz olarak yorumlanamazlar. Onlar sadece normal fonksiyonlardır. Boşlukları doldurmak için bazı yenilerini kabul edersiniz (defun ...). – jtdubs

2

Eh, hata mesajı başına, hiçbir cadddar işlevi yoktur. car ve cdr'un ilkel liste okuma işlevleri olduğunu unutmayın. caddar gibi diğerleri, bir veya daha fazla car ve cdr'un birleşiminden oluşturulan kullanışlı işlevlerdir. Yani, sadece car ve cdr ile sadece car ve cdr ile liste manipülasyonunu gerçekleştirebilirsiniz, genişletilmiş fonksiyonlar sadece hayatınızı biraz kolaylaştırır.

Bu nedenle, buna yaklaşımın yolu, car ve cdr kullanarak kendi cadddar'u sentezlemektir. Bunun nasıl yapılacağı hemen anlaşılmazsa, basitleştirmeye başlayın (cadr veya cdar ile) ve cadddar'a kadar oluşturun.

1
(first (last (first '(((1 2) 3 4 5) ((6 7) 8 9 10))))) 

-> 5 
1

fonksiyonları 4'ten fazla a ler ve d s standardında tanımlanmış değildir, belki çünkü orada bunlardan 32 olan [ve bundan sonra katlanarak daha da karmaşıklaşır].

listenin son elemanını almak için bir kesin yolu

: Geçen eksileri hücre döndürür last yüzden

(car (last list)) 

size son liste elemanını verir. Tabii ki list, (first list) gibi başka bir şey olabilir.