summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--GNUmakefile12
-rw-r--r--MLKInteger.m6
-rw-r--r--MLKRatio.h16
-rw-r--r--MLKRatio.m110
-rw-r--r--MLKReader.m3
5 files changed, 137 insertions, 10 deletions
diff --git a/GNUmakefile b/GNUmakefile
index e9cbdd4..df47afe 100644
--- a/GNUmakefile
+++ b/GNUmakefile
@@ -18,12 +18,12 @@
include $(GNUSTEP_MAKEFILES)/common.make
TOOL_NAME = etoilisp
-etoilisp_OBJC_FILES = MLKCharacter.m MLKCons.m MLKDynamicContext.m \
- MLKEndOfFileError.m MLKEnvironment.m MLKError.m \
- MLKInteger.m MLKLinkedList.m MLKLispValue.m \
- MLKPackage.m MLKReader.m MLKReadtable.m \
- MLKReaderError.m MLKStream.m MLKSymbol.m \
- MLKThrowException.m \
+etoilisp_OBJC_FILES = MLKCharacter.m MLKCons.m MLKDynamicContext.m \
+ MLKEndOfFileError.m MLKEnvironment.m MLKError.m \
+ MLKInteger.m MLKLinkedList.m MLKLispValue.m \
+ MLKPackage.m MLKRatio.m MLKReader.m MLKReadtable.m \
+ MLKReaderError.m MLKStream.m MLKSymbol.m \
+ MLKThrowException.m \
MLKUndefinedVariableException.m
BUNDLE_NAME = Test
diff --git a/MLKInteger.m b/MLKInteger.m
index 95b2e4a..7239f0b 100644
--- a/MLKInteger.m
+++ b/MLKInteger.m
@@ -61,9 +61,9 @@
integerWithMPZ:)
DEFINE_MPZ_TWOARG_OPERATION (add:, mpz_add)
-DEFINE_MPZ_TWOARG_OPERATION (subtract:, mpz_add)
-DEFINE_MPZ_TWOARG_OPERATION (multiplyWith:, mpz_add)
-DEFINE_MPZ_TWOARG_OPERATION (divideBy:, mpz_add)
+DEFINE_MPZ_TWOARG_OPERATION (subtract:, mpz_sub)
+DEFINE_MPZ_TWOARG_OPERATION (multiplyWith:, mpz_mul)
+DEFINE_MPZ_TWOARG_OPERATION (divideBy:, mpz_div)
-(int) intValue
{
diff --git a/MLKRatio.h b/MLKRatio.h
index 37d5879..6104955 100644
--- a/MLKRatio.h
+++ b/MLKRatio.h
@@ -30,9 +30,25 @@
mpq_t value;
}
+-(MLKRatio *) initWithString:(NSString *)string
+ base:(unsigned int)base;
+-(MLKRatio *) initWithNumeratorString:(NSString *)numerString
+ denominatorString:(NSString *)denomString
+ negative:(BOOL)negative
+ base:(unsigned int)base;
+
+(MLKRatio *) ratioWithNumeratorString:(NSString *)numerString
denominatorString:(NSString *)denomString
+ negative:(BOOL)negative
base:(unsigned int)base;
+-(MLKRatio *) add:(MLKRatio *)arg;
+-(MLKRatio *) subtract:(MLKRatio *)arg;
+-(MLKRatio *) multiplyWith:(MLKRatio *)arg;
+-(MLKRatio *) divideBy:(MLKRatio *)arg;
+
+-(NSString *) description;
+-(NSString *) descriptionWithBase:(int)base;
+
-(void) dealloc;
@end
diff --git a/MLKRatio.m b/MLKRatio.m
new file mode 100644
index 0000000..3685f1c
--- /dev/null
+++ b/MLKRatio.m
@@ -0,0 +1,110 @@
+/* -*- mode: objc; coding: utf-8 -*- */
+/* Étoilisp/Mulklisp, a Common Lisp subset for the Étoilé runtime.
+ * Copyright (C) 2008 Matthias Andreas Benkard.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#import "MLKRatio.h"
+#import "util.h"
+
+#import <Foundation/NSString.h>
+
+@implementation MLKRatio
+-(MLKRatio *) initWithMPQ:(mpq_t)mpq
+{
+ self = [super init];
+ mpq_init (value);
+ mpq_set (value, mpq);
+ return self;
+}
+
++(MLKRatio *) ratioWithMPQ:(mpq_t)mpq
+{
+ return AUTORELEASE ([[MLKRatio alloc] initWithMPQ:mpq]);
+}
+
+-(MLKRatio *) initWithString:(NSString *)string
+ base:(unsigned int)base
+{
+ self = [super init];
+ mpq_init (value);
+ mpq_set_str (value, [string UTF8String], 10);
+ return self;
+}
+
+-(MLKRatio *) initWithNumeratorString:(NSString *)numerString
+ denominatorString:(NSString *)denomString
+ negative:(BOOL)negative
+ base:(unsigned int)base
+{
+ return [self initWithString:[NSString stringWithFormat:@"%c%@/%@",
+ (negative ? '-' : '+'),
+ numerString,
+ denomString]
+ base:base];
+}
+
++(MLKRatio *) ratioWithNumeratorString:(NSString *)numerString
+ denominatorString:(NSString *)denomString
+ negative:(BOOL)negative
+ base:(unsigned int)base
+{
+ return AUTORELEASE ([[MLKRatio alloc] initWithNumeratorString:numerString
+ denominatorString:denomString
+ negative:negative
+ base:base]);
+}
+
+#define DEFINE_MPQ_TWOARG_OPERATION(SELECTOR, GMPFUN) \
+ DEFINE_GMP_OPERATION (SELECTOR (MLKRatio *)arg, \
+ mpq, \
+ GMPFUN (mpval, self->value, arg->value), \
+ MLKRatio, \
+ ratioWithMPQ:)
+
+DEFINE_MPQ_TWOARG_OPERATION (add:, mpq_add)
+DEFINE_MPQ_TWOARG_OPERATION (subtract:, mpq_sub)
+DEFINE_MPQ_TWOARG_OPERATION (multiplyWith:, mpq_mul)
+DEFINE_MPQ_TWOARG_OPERATION (divideBy:, mpq_div)
+
+-(double) doubleValue
+{
+ return mpq_get_d (value);
+}
+
+-(NSString *) description
+{
+ return [self descriptionWithBase:10];
+}
+
+-(NSString *) descriptionWithBase:(int)base
+{
+ NSString *str;
+ char cstr[mpz_sizeinbase (mpq_numref(self->value), base)
+ + mpz_sizeinbase (mpq_denref(self->value), base)
+ + 3];
+
+ mpq_get_str (cstr, base, self->value);
+ str = [NSString stringWithUTF8String:cstr];
+
+ return str;
+}
+
+-(void) dealloc
+{
+ mpq_clear (value);
+ [super dealloc];
+}
+@end
diff --git a/MLKReader.m b/MLKReader.m
index 14a6268..eb9a9fc 100644
--- a/MLKReader.m
+++ b/MLKReader.m
@@ -355,12 +355,13 @@
// Assume token[i] is a slash.
i++;
secondNum = i;
-
+
return [MLKRatio ratioWithNumeratorString:
[token substringWithRange:
NSMakeRange (firstNum,
secondNum - firstNum - 1)]
denominatorString:[token substringFromIndex:secondNum]
+ negative:negative
base:[base intValue]];
}
else