2010-08-12 7 views
12

Wspólne LISP i Emacs LISP mają predykaty typu atomu. Scheme i Clojure go nie mają. http://hyperpolyglot.wikidot.com/lispSchemat i Clojure nie mają predykatu typu atomu - czy jest to zgodne z projektem?

Czy istnieje powód do tego projekt - czy jest to po prostu nie jest niezbędny do włączenia funkcji API?

+0

oprócz ogólnej ciekawości, czy istnieje powód, by znaleźć zastosowanie dla niego? Obiekt jest albo atomem, albo obiektem złożonym, a zwykle interesuje Cię rodzaj obiektu złożonego, prawda? –

+0

Niektóre schematy pochodzą z różnych małych rzeczy, takich jak atom? predefiniowane dla Twojej wygody. Na przykład, [Petite] Chez Scheme ma najbardziej trywialne funkcje, które można by oczekiwać. – erjiang

Odpowiedz

14

W Clojure, predykat atomowy nie jest tak ważny, ponieważ Clojure podkreśla różne inne typy (niezmienne) data structures zamiast skupiać się na komórkach/listach cons.

Może to również powodować zamieszanie. Jak byś się spodziewał, że ta funkcja będzie zachowywać się, gdy otrzymasz na przykład mieszankę, zestaw lub wektor? Lub obiekt Java, który reprezentuje jakąś złożoną zmienną strukturę danych?

Również nazwa "atom" jest używana do czegoś zupełnie innego - jest to jeden z podstawowych mechanizmów współbieżności Clojure'a to manage shared, synchronous, independent state.

6

W całych standardowych IronScheme bibliotek realizujących R6RS, nigdy nie potrzebował takiej funkcji.

Podsumowując:

  • Jest bezużyteczny
  • Łatwo jest napisać jeśli jest to potrzebne

Który dość dużo następuje minimalistycznego podejścia w schemacie.

12

Clojure ma funkcję coll? (kolekcja?), Która jest (rodzaj) odwrotnością atom?.

1

To banalna funkcja:

(defun atom (x) 
    (not (consp x))) 

Jest on stosowany w przetwórstwie listy, gdy Lisp dialekt używa wagoników do budowania list. Istnieje kilka "Lisps", w przypadku których nie ma to miejsca lub nie ma charakteru centralnego.

2

W schemacie wszystko, co nie jest pair, jest atom. Jak Schemat już określa orzeczenie pair? The atom? orzeczenie nie jest potrzebna, ponieważ jest tak trywialne, aby określić:

(define (atom? s) 
    (not (pair? s))) 
+0

Schemat nie zna różnicy między parą a listą? A może zmieniła koncepcję pary? W Lispie nie ma czegoś takiego jak para, tylko atomy, minusy i listy. Dopóki wiem, że para składa się z dwóch rzeczy. Możesz więc powiedzieć, że lista dwóch elementów to para, ale nie lista trzech lub więcej. Ale zrobienie listy dwóch elementów jako pary nie jest koncepcyjnie dobre. Lepiej powiedzieć jedno od drugiego. – Alfgaar

+0

@Alfgaar: To nie w porządku. Lista jest strukturą danych rekurencyjnych: każda lista jest pustą listą lub parą, gdzie drugi element, cdr, sam jest listą. Lista 100 pozycji jest wciąż parą, zawierającą łańcuch par. –

6

W książce The Little Schemer, atom? jest zdefiniowany następująco:

(define (atom? x) 
    (and (not (pair? x)) 
     (not (null? x)))) 

Stwierdzając, że null nie jest uważany za atom, jak sugerowały inne odpowiedzi. W wymienionej książce atom? jest używany intensywnie, w szczególności podczas pisania procedur, które dotyczą list list.

+1

Awesome! Kochałem tę książkę. – hawkeye

+0

Schemat jest naprawdę dziwnym językiem, ma wartość null zamiast zera, a null nie jest atomem. Schemat musi być najbardziej dziwnym dialektem seplenienia poza javascript. – Alfgaar

+0

Myślę, że musisz dodać "(nie (procedura? X)" do tej definicji, chyba że procedura jest atomem. – Alfgaar

0

Atom jest albo symbol, znak, numer, lub wartość null.

(define (atom? a) 
    (or (symbol? a) 
     (char? a) 
     (number? a) 
     (null? a))) 

Myślę, że te są wszystkie atomy, które istnieją, jeśli znajdziesz więcej dodaj do conditional expression. Na przykład, jeśli uważasz, że ciąg jest atomem, dodaj (ciąg? A), :-). Brak definicji atomu, pozwala zdefiniować go tak, jak chcesz. Przecież Schemat nie wie, czym jest atom.

W języku Lisp nil jest atomem, więc utworzyłem null atom. nil jest również listą przez uproszczenie nil = (nil . nil), w ten sam sposób, w jaki liczby całkowite są liczbami wymiernymi przez uproszczenie, 2 = 2/1, 2 jest liczbą całkowitą, 2/1 jest liczbą wymierną, ponieważ oba są równe przez uproszczenie racjonalnego; jeden mówi, że liczba całkowita 2 jest również liczbą wymierną. Ale predykat listy jest już zdefiniowany w Scheme, nie ma się czym martwić.

O pytanie. Tak długo, jak mnie to obchodzi Schemat ma predykaty tylko dla typów klas, atom nie jest typem klasy, atom to abstrakcja, która zawiera kilka typów klas. Może to jest powód. Ale para nie jest również typem klasy, ale nie zawiera kilku typów klas, a niektóre mogą traktować parę jako typ klasy.

Atom oznacza, że ​​pewne rzeczy nie są złożone. Jednym z powodów, aby nie uwzględniać takiego predykatu, jest to, kiedy język pozwala na definiowanie typów atomowych, więc liczba atomów może rosnąć coraz szerzej, a takie orzeczenie nie ma sensu. Nie wiem, czy Scheme na to pozwala. Mogę tylko powiedzieć, że schematy predykatów (te wbudowane) są specyficzne. Możesz zapytać: czy to jest jabłko?, to jest pomarańczowy?; ale nie możesz zapytać: czy to jest owoc?. :-). Cóż, możesz, jeśli zrobisz to sam. Pomimo tego, co powiedziano, Scheme ma ogólny predykat number? i predykaty specyficzne dla liczb, integer?, rational?, real?; niezależnie od tego liczba może być uważana za typ klasy (inne predykaty odnoszą się do podtypów liczby), podczas gdy atom nie jest (przynajmniej na Schemacie).

Uwaga: typy klas: rodzaje, które należą do pewnej klasy rzeczy. Przykład:

numer, całkowita, rzeczywista, racjonalne, charakter, procedura, lista, wektor, łańcuch, itp

Powiązane problemy