2016-06-09 11 views
1

Viele objektorientierte Skriptsprachen verfügen über einen Operator oder eine Funktion, um zu testen, ob ein Objekt eine Instanziierung eines bestimmten Tupels oder Typs ist. JavaScript hat den instanceof Operator, hat Python eine isinstance builtin sowie eine issubclass builtin usw.Warum nicht ein `Beispiel?` Wort?

Aber in Factor, alle Tupel Klassen und Objekttypen sind ihre eigenen instance? Wort gegeben:

TUPLE: car speed ; 
! autogenerated is the word car?, which tests if something is a car 
TUPLE: boat weight ; 
! autogenerated is the word boat?, which tests if something is a boat 
100 boat boa boat? ! -> t 
100 boat boa car? ! -> f 

Boote sind Boote und Autos sind Autos. Autos sind keine Boote.

100 boat boa boat instance-of? ! -> t 
100 boat boa car instance-of? ! -> f 

Stattdessen jedes Objekt in Factor hat sein eigenes spezialisiertes instance? Wort:

Wir konnten die letzten beiden Zeilen wie neu formulieren. Ist dies nur der Kürze und Lesbarkeit wegen, oder gibt es einen Implementierungsgrund?

Möchten Sie das Wort instance? auf bestimmte Objekte aus irgendeinem Grund anpassen? Wir haben Generika für das ...

Antwort

1

Ihre instance-of? die meiste Zeit funktionieren würde: für kompliziertere Typen

: instance-of? (obj cls -- ?) [ class-of ] dip class<= ; 
123 boat boa boat instance-of? . 
t 
123 boat boa tuple instance-of? . 
t 
123 fixnum instance-of? . 
t 

Aber es ist nicht gut genug:

QUALIFIED: math.primes 
PREDICATE: even < integer 2 mod 0 = ;  
PREDICATE: prime < integer math.primes:prime? ; 
7 prime? . 
t 
6 even? 
t 
7 prime instance-of? 
f 
6 even instance-of? . 
f 

Der andere Grund ist, Optimierung. Wörter wie fixnum?, string? und array?, die in leistungsempfindlichen Code verwendet werden, sind viel einfacher zu machen als ein allgemeineres instance-of? Wort.