вдохновленную 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 и удвоений, есть ли какие-то уловки, которые я могу сделать, чтобы добраться туда, где я хочу? Меня даже не волнует, суперэффективно ли это (хотя это всегда плюс!)