(module number-parser-3 (main get-number-string)) ;; Comme le programme précédent, mais un opérateur et deux ;; nombres sur la ligne de commande. Si l'opérateur est aussi ;; un opérateur du shell comme la multiplication, le mettre entre ;; quotes : '*' (define (get-number-string args) (let ((op (eval (string->symbol (cadr args)))) (n1 (parse2number (caddr args))) (n2 (parse2number (cadddr args)))) (print (op n1 n2)) )) ;; (define (parse2number number-string) (let* ((regexp "^(\\+|-)?([0-9]*)(\\.([0-9]*))?(\\^((\\+|-)?[0-9]+))?$") (number-elems (pregexp-match regexp number-string)) ;; on décompose chaque nombre en éléments simples (sign-num (cadr number-elems)) (int-part (caddr number-elems)) (point-part (cadddr number-elems)) (exponent (caddr (cddddr number-elems))) ;; si un élément donne #f on le remplace par la chaîne vide (mantissa (string-append (or sign-num "") int-part (or point-part "")))) (if exponent (expt (string->number mantissa) (string->number exponent)) (string->number mantissa))))