我一直在尝试在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)y
、add:(long)x to:(float)y
等,通过所有可能的组合,并减少参数列表上的成对添加。当然,obj-c不支持重写这样的方法。除了限制自己只参加NSIntegers和双打之外,我还能做什么把戏来达到我想要的目的吗?我甚至不在乎它是否超高效(不过,这总是一个优点!(
Easy方法:在进行算术运算时,只需将所有数字转换为double
s,而忽略强制转换和精度问题。
另一种选择是在任何地方使用NSDecimalNumber
而不是NSNumber
。有一种+[NSDecimalNumber decimalNumberWithString]
方法可以用于装箱,也有一些方法可以使用多个NSDecimalNumber
s执行算术。当然,这样会有更多的开销,但我认为原始性能不是主要问题。