Re: A style question




Rob Warnock wrote:
Ken Tilton <kentilton@xxxxxxxxx> wrote:
+---------------
| ps. Me, I am not starting until we get the functional requirements
| cleared up. k
+---------------

See my reply to <nallen05@xxxxxxxxx>'s MOD-free code-generating macro,
or take this instead:

Macro DEF-FIZZ-BUZZ -- Define a "fizz-buzz"-generating function

Syntax:
def-fizz-buzz fname alist ==> fname

Arguments and Values:
fname -- A symbol, the name of the function to be defined (as by DEFUN).

alist -- an association list, whose keys are prime integers > 1
and whose values are strings.

Description:

DEF-FIZZ-BUZZ defines a function named FNAME of one argument,
a positive integer. When called with an argument (say) N, FNAME
will print each positive integer starting with 1 below N, followed
by a newline, except that if any of the keys of the ALIST evenly
divide the current integer, then the corresponding string value(s)
of the key(s) dividing the current integer will be printed instead
of the integer itself. Note: If multiple keys divide the current
integer, all of the corresponding string values will be printed,
in the same order as the elements of the ALIST. Only one copy
of any string value will be printed for any current integer.

Examples:

(def-fizz-buzz 'fizz-buzz '((3 . "Fizz") (5 . "Buzz"))) ==> FIZZ-BUZZ

(fizz-buzz 22)
>> 1
>> 2
>> Fizz
>> 4
>> Buzz
>> Fizz
>> 7
>> 8
>> Fizz
>> Buzz
>> 11
>> Fizz
>> 13
>> 14
>> FizzBuzz
>> 16
>> 17
>> Fizz
>> 19
>> Buzz
>> Fizz
>> 22
==> NIL

(def-fizz-buzz 'very-fizzy
'((2 . "Burp") (3 . "Fizz") (5 . "Buzz") (7 . "Bang")))
==> VERY-FIZZY

(very-fizzy 16)
>> 1
>> Burp
>> Fizz
>> Burp
>> Buzz
>> BurpFizz
>> Bang
>> Burp
>> Fizz
>> BurpBuzz
>> 11
>> BurpFizz
>> 13
>> BurpBang
>> FizzBuzz
>> Burp
==> NIL

There's your spec. Where's your code? ;-}

ok, here ya go...

(defmacro def-fizz-buzz (name alist)
(let (l
(lcd (reduce #'* alist :key #'first)))
(do ((n 1 (incf n)))
((> n lcd))
(push '(terpri) l)
(let ((old l))
(dolist (a alist)
(when (zerop (mod n (first a)))
(push `(princ ,(rest a)) l)))
(when (eq l old)
(push '(princ y) l)))
(push '(when (> (incf y) x) (return)) l))
`(defun ,name (x)
(let ((y 1))
(loop ,@(nreverse l))))))


CL-USER> (macroexpand-1 '(def-fizz-buzz very-fizzy ((2 . "Burp") (3 .
"Fizz") (5 . "Buzz"))))
(DEFUN VERY-FIZZY (X)
(LET ((Y 1))
(LOOP (TERPRI)
(PRINC Y)
(WHEN (> (INCF Y) X) (RETURN))
(TERPRI)
(PRINC "Burp")
(WHEN (> (INCF Y) X) (RETURN))
(TERPRI)
(PRINC "Fizz")
(WHEN (> (INCF Y) X) (RETURN))
(TERPRI)
(PRINC "Burp")
(WHEN (> (INCF Y) X) (RETURN))
(TERPRI)
(PRINC "Buzz")
(WHEN (> (INCF Y) X) (RETURN))
(TERPRI)
(PRINC "Burp")
(PRINC "Fizz")
(WHEN (> (INCF Y) X) (RETURN))
(TERPRI)
(PRINC Y)
(WHEN (> (INCF Y) X) (RETURN))
(TERPRI)
(PRINC "Burp")
(WHEN (> (INCF Y) X) (RETURN))
(TERPRI)
(PRINC "Fizz")
(WHEN (> (INCF Y) X) (RETURN))
(TERPRI)
(PRINC "Burp")
(PRINC "Buzz")
(WHEN (> (INCF Y) X) (RETURN))
(TERPRI)
(PRINC Y)
(WHEN (> (INCF Y) X) (RETURN))
(TERPRI)
(PRINC "Burp")
(PRINC "Fizz")
(WHEN (> (INCF Y) X) (RETURN))
(TERPRI)
(PRINC Y)
(WHEN (> (INCF Y) X) (RETURN))
(TERPRI) (PRINC "Burp")
(WHEN (> (INCF Y) X) (RETURN))
(TERPRI) (PRINC "Fizz")
(PRINC "Buzz")
(WHEN (> (INCF Y) X) (RETURN))
(TERPRI)
(PRINC "Burp")
(WHEN (> (INCF Y) X) (RETURN))
(TERPRI) (PRINC Y)
(WHEN (> (INCF Y) X) (RETURN))
(TERPRI)
(PRINC "Burp")
(PRINC "Fizz")
(WHEN (> (INCF Y) X) (RETURN))
(TERPRI)
(PRINC Y)
(WHEN (> (INCF Y) X) (RETURN))
(TERPRI)
(PRINC "Burp")
(PRINC "Buzz")
(WHEN (> (INCF Y) X) (RETURN))
(TERPRI)
(PRINC "Fizz")
(WHEN (> (INCF Y) X) (RETURN))
(TERPRI)
(PRINC "Burp")
(WHEN (> (INCF Y) X) (RETURN))
(TERPRI)
(PRINC Y)
(WHEN (> (INCF Y) X) (RETURN))
(TERPRI)
(PRINC "Burp")
(PRINC "Fizz")
(WHEN (> (INCF Y) X) (RETURN))
(TERPRI)
(PRINC "Buzz")
(WHEN (> (INCF Y) X) (RETURN))
(TERPRI)
(PRINC "Burp")
(WHEN (> (INCF Y) X) (RETURN))
(TERPRI)
(PRINC "Fizz")
(WHEN (> (INCF Y) X) (RETURN))
(TERPRI)
(PRINC "Burp")
(WHEN (> (INCF Y) X) (RETURN))
(TERPRI)
(PRINC Y)
(WHEN (> (INCF Y) X) (RETURN))
(TERPRI)
(PRINC "Burp")
(PRINC "Fizz")
(PRINC "Buzz")
(WHEN (> (INCF Y) X) (RETURN)))))
T
CL-USER>

.



Relevant Pages

  • Re: The Lisp CPU
    ... Frank Buss writes: ... > I have a first version for review: ... is called (terpri) ...
    (comp.lang.lisp)
  • Re: TERPRI
    ... > output facility. ... There was just TYO, ... > and there was PRINC and PRINT. ... and you called TERPRI a lot. ...
    (comp.lang.lisp)