diff options
| author | Matthias Andreas Benkard <matthias@benkard.de> | 2008-06-16 11:02:11 +0200 | 
|---|---|---|
| committer | Matthias Andreas Benkard <matthias@benkard.de> | 2008-06-16 11:02:11 +0200 | 
| commit | cddf492efdf7e44b26a0093fced5673a78c2fd28 (patch) | |
| tree | e0f9d4efe7676bbcfa3029b2969b87246823c9c8 | |
| parent | ce205cc7273a031ed6bbde71ba340a7996de6d5d (diff) | |
MLKFloat: Explicitly declare the contract for subclasses.
| -rw-r--r-- | MLKFloat.h | 18 | ||||
| -rw-r--r-- | MLKFloat.m | 26 | 
2 files changed, 42 insertions, 2 deletions
@@ -20,7 +20,12 @@  #import <Foundation/NSString.h> - +// An MLKFloat can represent any kind of CL floating-point number. +// +// MLKFloat itself is not instantiable.  It is a class cluster whose +// instances are of one of its subclasses (currently MLKSingleFloat und +// MLKDoubleFloat; an arbitrary-precision, GMP-backed type is planned +// for the future).  @interface MLKFloat : MLKLispValue  +(MLKFloat *) floatWithExponentMarker:(unichar)exponentMarker                            integerPart:(NSString *)intPart @@ -28,4 +33,15 @@                         fractionalPart:(NSString *)fractPart                               exponent:(NSString *)exponent                       exponentNegative:(BOOL)exponentNegative; + +// Abstract methods. +-(float) floatValue; +-(double) doubleValue; + +-(MLKFloat *) add:(MLKFloat *)arg; +-(MLKFloat *) subtract:(MLKFloat *)arg; +-(MLKFloat *) multiplyWith:(MLKFloat *)arg; +-(MLKFloat *) divideBy:(MLKFloat *)arg; + +-(NSString *) description;  @end @@ -21,6 +21,7 @@  #import "MLKDoubleFloat.h"  #import "MLKPackage.h"  #import "MLKDynamicContext.h" +#import "MLKError.h"  @implementation MLKFloat : MLKLispValue @@ -32,9 +33,13 @@                       exponentNegative:(BOOL)exponentNegative  {    MLKSymbol *defaultFormat; -  MLKPackage *cl = [MLKPackage findPackage:@"COMMON-LISP"]; +  MLKPackage *cl; + +  cl = [MLKPackage findPackage:@"COMMON-LISP"];    defaultFormat = [[MLKDynamicContext currentContext]                      valueForBinding:[cl intern:@"*READ-DEFAULT-FLOAT-FORMAT*"]]; + +  // FIXME: Shouldn't the readtable decide which exponent markers do what?    if (exponentMarker == 'd' || exponentMarker == 'D'        || exponentMarker == 'l' || exponentMarker == 'L'        || ((exponentMarker == 'e' || exponentMarker == 'E') @@ -52,4 +57,23 @@                             exponent:exponent                             exponentNegative:exponentNegative];  } + +#define DECLARE_ABSTRACT(SIGNATURE, RETURN_VALUE)                       \ +  SIGNATURE                                                             \ +  {                                                                     \ +    [[MLKError errorWithMessage:@"Tried to invoke an abstract method."] raise]; \ +    return RETURN_VALUE;                                                \ +  } + +DECLARE_ABSTRACT (-(float) floatValue, 0.0) +DECLARE_ABSTRACT (-(double) doubleValue, 0.0) +DECLARE_ABSTRACT (-(MLKFloat *) add:(MLKFloat *)arg, nil) +DECLARE_ABSTRACT (-(MLKFloat *) subtract:(MLKFloat *)arg, nil) +DECLARE_ABSTRACT (-(MLKFloat *) multiplyWith:(MLKFloat *)arg, nil) +DECLARE_ABSTRACT (-(MLKFloat *) divideBy:(MLKFloat *)arg, nil) + +-(NSString *) description +{ +  return [super description]; +}  @end  | 
