目标c-我真的如何用NSNumbers做数学?(在obj-c中实现lisp)


受Clojure和Peter Norvig 的启发

我一直在尝试在obj-c中实现一个简单的Lisp。我有很多基础知识(包括一些类似于Clojure的酷可可集成(正在运行,我想继续学习算术。

到目前为止,我是如何实现这一点的:我使用了一个小类"Scope",它只是本地变量的NSMutableDictionary,指针指向父级"Scope"。(也就是说,我只能存储对象。(

我使用以下规则解析数字:像2或2.7这样的普通数字会转换为[NSNumber numberWithIneger:][NSNumber numberWithDouble:]。但是对于cocoa集成,您也可以执行2i或4U之类的操作,以创建具有特定标量类型的NSNumber。(我还围绕NSObject创建了一个类别,并制作了一个新方法performSelector:withObjects:,它巧妙地取消了args的框,并将返回类型框起来,使其真正有用(

我有一个特殊的形式,看起来像:(static Math add: 1 2 3 4),它将变成一个obj-c方法调用,看起来像是:[Math add:args]

考虑到这一切,我想问大家的问题是:实现"add:"方法的好方法是什么?

我希望能做一些类似于我认为clojure(过去是怎么做的?(的事情,通过实现一系列方法,如add:(int)x to:(long)yadd:(long)x to:(float)y等,通过所有可能的组合,并减少参数列表上的成对添加。当然,obj-c不支持重写这样的方法。除了限制自己只参加NSIntegers和双打之外,我还能做什么把戏来达到我想要的目的吗?我甚至不在乎它是否超高效(不过,这总是一个优点!(

Easy方法:在进行算术运算时,只需将所有数字转换为doubles,而忽略强制转换和精度问题。

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

最新更新