Wie mache ich wirklich mit NSNumbers Mathematik? (Implementieren eines Lisp in Obj-c)

8

inspiriert von Clojure und Peter Norvig

Ich habe versucht, ein einfaches Lisp in obj-c zu implementieren. Ich habe viele Grundlagen (einschließlich einiger cooler Kakaoproduktion, die Clojure ähnlich ist) arbeiten und möchte zur Arithmetik weitergehen.

Ein kleiner Hintergrund, wie ich das bisher implementiert habe: Ich verwende eine kleine Klasse "Scope", die nur ein NSMutableDictionary für lokale vars ist, mit einem Zeiger auf einen übergeordneten "Scope". (AKA, ich bin gezwungen, nur Objekte zu speichern.)

Ich parse Zahlen mit der folgenden Regel: Eine einfache Zahl wie 2 oder 2,7 wird in ein [NSNumber numberWithIneger:] oder [NSNumber numberWithDouble:] konvertiert. Für die Kakao-Integration können Sie aber auch 2i oder 4U verwenden, um die NSNumber mit einem bestimmten Skalartyp zu erstellen. (Ich habe auch eine Kategorie um NSObject erstellt und eine neue Methode performSelector:withObjects: erstellt, die die Argumente intelligent aufhebt, und Boxen den Rückgabetyp sichern, um dies wirklich nützlich zu machen)

Ich habe ein spezielles Formular, das wie folgt aussieht: (static Math add: 1 2 3 4) , was zu einem obj-c Methodenaufruf wird, der wie folgt aussieht: [Math add:args]

Angesichts all dieser Dinge meine Frage an alle von euch feinen Leuten ist: Was ist ein guter Weg, um die "add:" Methode zu implementieren?

Ich hatte gehofft, etwas Ähnliches zu tun, wie ich glaube, dass clojure es tut, indem es eine Reihe von Methoden wie add:(int)x to:(long)y , add:(long)x to:(float)y usw. durch alle möglichen Kombinationen implementiert und reduziert über die args Liste paarweise hinzufügen alles. Aber obj-c unterstützt natürlich keine solchen Methoden. Abgesehen davon, dass ich mich nur auf NSIntegers und Doubles beschränke, gibt es irgendeine Art von Trickserei, die ich tun kann, um dahin zu kommen, wo ich will? Es ist mir auch nicht wirklich wichtig, ob es super effizient ist (obwohl das immer ein Plus ist!)

    
Bob White 16.06.2011, 18:18
quelle

1 Antwort

1

Einfache Methode: wandle einfach alle Zahlen in double s um, wenn du arithmetisch vorgibst, und ignoriere das Gießen und Präzisionsprobleme.

Eine andere Option ist NSDecimalNumber anstelle von NSNumber überall zu verwenden. Es gibt die Methode +[NSDecimalNumber decimalNumberWithString] , die Sie für das Boxen verwenden können, und es gibt auch Methoden zum Ausführen von Arithmetik mit mehreren NSDecimalNumber s. Natürlich haben Sie auf diese Weise mehr Aufwand, aber ich stelle mir vor, dass die rohe Leistung kein Hauptanliegen ist.

    
Daniel Dickison 16.06.2011, 18:44
quelle

Tags und Links