2011-06-16 19 views
8

Clojure esinlenerek (obj-c bir lisp uygularken) ve Peter NorvigNSNumbers ile gerçekten nasıl matematik yapabilirim?

Ben obj-c basit Lisp'i uygulanması elimi çalışıyorlar. Temel bilgilerim (Clojure'ye benzeyen bazı kakao entegrasyonu da dahil olmak üzere) çalışıyorum ve aritmetiğe geçmek istiyorum.

Şimdiye kadar bunu nasıl uygulayacağımın biraz arka planı: Küçük bir "Scope" kullanıyorum, bu da yerel varlıklar için bir NSMutableDictionary. (AKA, sadece nesneleri saklamakla sınırlandım.)

Numaraları şu kuralla ayrıştırıyorum: 2 veya 2,7 gibi düz bir sayı [NSNumber numberWithIneger:] veya [NSNumber numberWithDouble:]'a dönüştürülür. Ancak kakao entegrasyonu için, belirli bir skalar tipte NSNumber'i oluşturmak için 2i veya 4U gibi şeyler de yapabilirsiniz. (Ben de NSObject etrafında bir kategori oluşturdu ve bu gerçekten bunu yapmak için geri almak için geri dönüş türünü kutularını ve kutuları geri kutularını performSelector:withObjects: yapılan yeni bir yöntem)

Ben gibi görünüyor özel bir form var: (static Math add: 1 2 3 4) Şu gibi görünen bir obj-c yöntem çağrısı dönüştürebilirsiniz: [Math add:args]

Tüm bunlar göz önüne alındığında, sorularımın iyi olduğu kişiler: "add:" yöntemini uygulamanın iyi bir yolu nedir?

tüm olası kombinasyonları yoluyla, vs, vs, add:(int)x to:(long)y, add:(long)x to:(float)y gibi yöntemlerle bir demet uygulayarak, (? Kullanım yapmak için) Ben Clojure inandığı, nasıl benzer bir şey yapması gerektiğini umuduyla ve args üzerinde azaltıcı edildi her şeyi ekleyerek çift liste. Ama elbette, obj-c, bunun gibi geçersiz yöntemleri desteklemiyor. Kendimi sadece NSIntegers ve iki katına eklemeye mecbur etmekten başka, istediğim yere ulaşmak için yapabileceğim herhangi bir hile var mı? Süper verimli olsa bile umrumda bile değil (yine de bu her zaman artı!)

cevap

1

Kolay yöntem: Sadece aritmetik yaparken tüm sayıları double s'ye çevirin ve döküm ve hassasiyet sorunlarını dikkate almayın.

Diğer bir seçenek, NSNumber yerine NSDecimalNumber kullanmaktır. Boks için kullanabileceğiniz +[NSDecimalNumber decimalNumberWithString] yöntemi vardır ve ayrıca birden çok NSDecimalNumber s ile aritmetiğin gerçekleştirilmesi için yöntemler vardır. Tabii ki, bu yolla daha fazla yükünüz var, ama ham performansın birincil bir sorun olmadığını hayal ediyorum.

+0

Wow, NSDecimalNumber'in farkında değildim, teşekkürler! Bu tam olarak istediğim gibi görünüyor ve birkaç hızlı testten sonra harika çalışıyor gibi görünüyor. Yuvarlama ve terfi/indirgemenin semantiği, bu proje ile başa çıkmak için yola koyduğum hedef değildi, bu yüzden ona bir şeylerin olması güzel. Ve haklısınız, performans öncelikli bir sorun değil; Kesinlikle bunu dilediğiniz zaman bir dil ittifakına göndermeyeceğim! –