灵感来自 Clojure,和 Peter Norvig
我一直在尝试用 obj-c 实现一个简单的 Lisp。我有许多基础知识(包括一些类似于 Clojure 的很酷的 cocoa 集成),并且想继续学习算术。
到目前为止我是如何实现这个的一些背景知识:我正在使用一个小类“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
等等,通过所有可能的组合,并减少 args 列表成对添加所有内容。但当然,obj-c 不支持这样的覆盖方法。除了将自己限制为仅对 NSIntegers 和 double 进行加法之外,我可以采取任何技巧来达到我想要的效果吗?我什至不在乎它是否 super 高效(不过,这总是一个加号!)
最佳答案
简单的方法:在进行算术运算时只需将所有数字都转换为double
,而忽略转换和精度问题。
另一种选择是在任何地方都使用NSDecimalNumber
而不是NSNumber
。您可以使用 +[NSDecimalNumber decimalNumberWithString]
方法进行装箱,也可以使用多个 NSDecimalNumber
执行算术运算。当然,这种方式的开销更多,但我认为原始性能不是主要问题。
关于objective-c - 我如何真正用 NSNumbers 做数学? (在 obj-c 中实现 lisp),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6376638/