我一直在努力在obj-c中实现一个简单的Lisp。我有许多基础知识(包括一些类似于Clojure的酷可可集成),并希望继续算术。
关于我到目前为止如何实现这一点的一些背景:我使用的是一个小类“Scope”,它只是一个用于本地变量的NSMutableDictionary,带有指向父“Scope”的指针。 (AKA,我只能存储对象。)
我使用以下规则解析数字:像2或2.7这样的普通数字会转换为[NSNumber numberWithIneger:]
或[NSNumber numberWithDouble:]
。但是对于可可集成,您还可以执行2i或4U之类的操作来创建具有特定标量类型的NSNumber。 (我还在NSObject周围创建了一个类别,并创建了一个新的方法performSelector:withObjects:
,它巧妙地将args取消装箱,并且备份返回类型以实际使其有用)
我有一个特殊的表单,如:(static Math add: 1 2 3 4)
,它会变成obj-c方法调用,如下所示:[Math add:args]
鉴于这一切,我向大家提出的问题是:实施“add:”方法的好方法是什么?
我希望通过所有可能的方法,通过实施一系列方法(如add:(int)x to:(long)y
,add:(long)x to:(float)y
等等)来做类似于我认为clojure(使用它?)的方法。组合,并减少args列表成对添加一切。但是当然,obj-c不支持这样的重写方法。除了限制我自己只添加NSIntegers和双打之外,我能做什么样的诡计才能得到我想要的地方?我甚至不在乎它是否超级高效(不过,这总是一个优点!)
答案 0 :(得分:1)
简单的方法:在算术时简单地将所有数字转换为double
,并忽略转换和精度问题。
另一种选择是在任何地方使用NSDecimalNumber
而不是NSNumber
。您可以使用+[NSDecimalNumber decimalNumberWithString]
方法进行装箱,还有一些方法可以使用多个NSDecimalNumber
执行算术运算。当然,这种方式有更多的开销,但我认为原始性能不是主要问题。