#!/bin/bash PROG=${0%.jl} [ \! -f $PROG.jlc -o $0 -nt $PROG.jlc ] && rep --batch --no-rc -l compiler -f compile-batch $0 exec rep "$PROG.jlc" "$@" !# ;;; $Id: ackermann.rep,v 1.5 2000/12/25 18:07:30 doug Exp $ ;;; http://www.bagley.org/~doug/shootout/ (define (ack M N) (cond ((= M 0) (+ N 1)) ((= N 0) (ack (- M 1) 1)) (t (ack (- M 1) (ack M (- N 1)))))) (let* ((arg (get-command-line-option "--num" t)) (n (if arg (read-from-string arg) 1))) (max-lisp-depth 2500) (format standard-output "Ack(3,%d): %d\n" n (ack 3 n))) ;; CMUCL implementation (defun fast-ack (m n) (declare (fixnum n m) (optimize (speed 3) (debug 0) (safety 0))) (the fixnum (cond ((zerop m) (the fixnum (1+ n))) ((zerop n) (the fixnum (fast-ack (1- m) 1))) (t (the fixnum (fast-ack (1- m) (the fixnum (fast-ack m (1- n))))))))) ;(defun ack (m n) ; (cond ; ((zerop m) (1+ n)) ; ((zerop n) (ack (1- m) 1)) ; (t (ack (1- m) (ack m (1- n)))))) ;; my stupid implementation (defun ack (m n) (if (and (= m 0) (/= n 0)) (+ n 1) (if (and (/= m 0) (= n 0)) (ack (- m 1) 1) (ack (- m 1) (ack m (- n 1)))))) ;; BUG (ack 0 0) -> inf. loop ;; haskell def: ;; ack 0 n = n+1 ;; ack (m+1) 0 = ack m 1 ;; ack (m+1) (n+1) = ack m (ack (m+1) n) ;; from comp.lang.lisp (defun ackermann (m n) (declare (fixnum m n) (optimize (speed 3) (safety 0))) (cond ((zerop m) (1+ n)) ((zerop n) (ackermann (1- m) 1)) (t (ackermann (1- m) (ackermann m (1- n)))))) (princ (ackermann 3 4))