灵感来自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:"方法的好方法是什么?
我希望做类似的事情我怎么相信Clojure的不(用做什么?)是,通过实施一堆类似的方法add:(int)x to:(long)y,add:(long)x to:(float)y等,等,通过所有可能的组合,并减少在的args列表成对将一切.但是当然,obj-c不支持这样的重写方法.除了限制我自己只添加NSIntegers和双打之外,我能做什么样的诡计才能得到我想要的地方?我真的不在乎它是否超级高效(不过,这总是一个优点!)
double简单的方法:在算术时将所有数字都转为s,忽略转换和精度问题。
另一种选择是使用NSDecimalNumber而不是NSNumber到处使用。有+[NSDecimalNumber decimalNumberWithString]可以用于装箱的方法,也有用于对多个NSDecimalNumbers 执行算术的方法。当然,这种方式会带来更多的开销,但我想原始性能并不是主要问题。
| 归档时间: |
|
| 查看次数: |
1035 次 |
| 最近记录: |