Как мне ДЕЙСТВИТЕЛЬНО выполнять математические вычисления с NSNumbers? (реализация лиспа в obj-c)

вдохновленную Clojure, и Питер Норвиг

Я пробовал свои силы в реализации простого Lisp в obj- c. У меня работают многие основы (включая некоторую классную интеграцию с какао, похожую на Clojure), и я хотел бы перейти к арифметике.

Небольшая справка о том, как я реализовал это до сих пор: я использую крошечный класс "Scope" , который является просто NSMutableDictionary для локальных варов с указателем на родительский объект «Scope». (AKA, я ограничен только хранением объектов.)

Я анализирую числа по следующему правилу: простое число, такое как 2 или 2.7, преобразуется в [NSNumber numberWithIneger:] или ] [NSNumber numberWithDouble:] . Но для интеграции какао вы также можете делать такие вещи, как 2i или 4U, чтобы создать NSNumber с определенным скалярным типом. (Я также создал категорию вокруг NSObject и создал новый метод performSelector: withObjects: , который быстро распаковывает аргументы и создает резервные копии возвращаемого типа, чтобы сделать это действительно полезным)

У меня есть специальная форма который выглядит так: (static Math add: 1 2 3 4) , который превратится в вызов метода obj-c, который выглядит так: [Math add: args]

Учитывая все это , мой вопрос ко всем вам, прекрасные ребята: как лучше всего реализовать метод "add:"?

Я надеялся сделать что-то похожее на то, как я считаю, что clojure делает (используется для этого?), путем реализации набор методов, таких как add: (int) x to: (long) y , add: (long) x to: (float) y и т. д., используя все возможные комбинации и уменьшение списка аргументов попарно, добавляя все. Но, конечно, obj-c не поддерживает такие методы переопределения. Помимо ограничения себя только добавлением NSIntegers и удвоений, есть ли какие-то уловки, которые я могу сделать, чтобы добраться туда, где я хочу? Меня даже не волнует, суперэффективно ли это (хотя это всегда плюс!)

8
задан Sophie Alpert 25 December 2011 в 23:05
поделиться