我如何真正使用NSNumbers进行数学运算? (在obj-c中实现lisp)

时间:2011-06-16 18:18:00

标签: objective-c lisp

受到Clojure和Peter Norvig

的启发

我一直在努力在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)yadd:(long)x to:(float)y等等)来做类似于我认为clojure(使用它?)的方法。组合,并减少args列表成对添加一切。但是当然,obj-c不支持这样的重写方法。除了限制我自己只添加NSIntegers和双打之外,我能做什么样的诡计才能得到我想要的地方?我甚至不在乎它是否超级高效(不过,这总是一个优点!)

1 个答案:

答案 0 :(得分:1)

简单的方法:在算术时简单地将所有数字转换为double,并忽略转换和精度问题。

另一种选择是在任何地方使用NSDecimalNumber而不是NSNumber。您可以使用+[NSDecimalNumber decimalNumberWithString]方法进行装箱,还有一些方法可以使用多个NSDecimalNumber执行算术运算。当然,这种方式有更多的开销,但我认为原始性能不是主要问题。