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

标签 objective-c lisp

灵感来自 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/

相关文章:

ios - 更新开发和分发证书——我应该对两者使用相同的 CSR 吗?

lisp - 优秀的 Common Lisp 代码示例?

emacs - 将光标定位在初始化重新绑定(bind)宏中

Lisp 列表迭代

objective-c - 创建自动调整大小的打印输出

ios - 从 NSMutableArray 中删除对象?

ios - 在 Storyboard 中以模态序列传递数据?

objective-c - 核心情节符号悬停/点击样式更改

macros - 是否有任何 Lisp 允许相互递归宏?

Emacs 练习变得更加舒适和熟悉编辑器本身以及 Lisp?