Anonymous user
99 Bottles of Beer/Lisp: Difference between revisions
no edit summary
imported>Rowsety Moid No edit summary |
|||
(8 intermediate revisions by 6 users not shown) | |||
Line 4:
{{collection|99 Bottles of Beer}}
[[99 Bottles of Beer]] done in Lisp-languages
-->▼
<!-- still missing:
Line 15 ⟶ 11:
__toc__
==
<
(if (zp n)
nil
Line 29 ⟶ 25:
(1- n)
(if (= n 2) 0 1))
(bottles-of-beer (- n 1)))))</
==
===Sensible solution===▼
(loop
▲<lang lisp>(defun bottles (x)
(bob n) (otw) (nl)
(bob n) (nl)
(tod-pia) (nl) (setq n (sub1 n))
(bob n) (otw) (nl)
(nl)
(until (zerop n))))
(defun nl ()
(printc))
(defun sing (w)
(princ w '! ))
(defun bob (n)
(map sing
(list (any? n) (plural? n 'bottle 'bottles) 'of 'beer)))
(defun otw ()
(map sing (list 'on 'the 'wall)))
(defun tod-pia ()
(defun any? (n)
(cond ((zerop n) 'no)
(t n)))
(defun plural? (n sing plur)
(cond ((onep n) sing)
(t plur)))</syntaxhighlight>
▲====Sensible solution====
<syntaxhighlight lang="lisp">(defun bottles (x)
(loop for bottles from x downto 1
do (format t "~a bottle~:p of beer on the wall~@
~:*~a bottle~:p of beer~@
Take one down, pass it around~@
~V[No more~:;~:*~a bottle~:p of~] beer on the wall~2%"
bottles (1- bottles))))
</syntaxhighlight>
and then just call
<syntaxhighlight lang
====Ridiculous====
<
(loop :for n :from 99 :downto 0 :collect n))</
The [http://www.lispworks.com/documentation/HyperSpec/Body/22_c.htm FORMAT function] is probably the most baroque (i.e. featureful almost to a fault) function in Common Lisp.
To really drive this point home, try replacing each instance of <tt>~D</tt>
Line 58 ⟶ 90:
* <tt>~:P</tt> is for English plurals: it prints <tt>s</tt> if the last argument wasn't 1; it prints nothing otherwise. There's also <tt>~@P</tt> for <tt>y</tt>/<tt>ies</tt>, in case you were worried about that.
Note, by the way, how the emoticons <tt>:*~D</tt> and <tt>:P</tt> have shown up in the format string. FORMAT is so powerful, it's even self-aware about how silly it is.
====Alternate solution====
<!-- missing here:▼
=={{header|Emacs Lisp}}==▼
▲=={{header|Lisp}}==
Bit of a beginner in Lisp, but this seems to work:
<
(defun beer-verse (count)
"Recurses the verses"
Line 81 ⟶ 108:
(beer-verse (- count 1))))
(beer-verse 99)
</syntaxhighlight>
▲<!-- missing here:
▲-->
3 bottles of beer on the wall▼
3 bottles of beer▼
▲Take one down, pass it round
2 bottles of beer on the wall▼
2 bottles of beer on the wall▼
Take one down, pass it round▼
1 bottle of beer on the wall▼
===newLISP===
<
(println n " bottles of beer on the wall," n " bottles of beer. Take one down, pass it around. ")
(println (- n 1) "bottles of beer on the wall!"))
Line 113 ⟶ 126:
" bottles of beer on the wall" (rec ( - bottles 1))))(list bottles))
(rec 99)</
===Ol===
<syntaxhighlight lang="scheme">
(define nn 99)
(for-each (lambda (n)
(let ((bottle (lambda (n) (if (eq? n 1) " bottle" " bottles")))
(m (- n 1)))
(print
n (bottle n) " of beer." "\n"
(if (eq? m 0) "no more" m)
(reverse (iota nn 1)))
(print
"Go to the store and buy some more, "
</syntaxhighlight>
==
<
(case N
(0 "No more beer")
Line 127 ⟶ 161:
(prinl "Take one down, pass it around,")
(prinl (bottles (dec 'N)) " on the wall.")
(prinl) )</
==
<
{ number --> string }
0 -> "No more beer"
Line 141 ⟶ 175:
X -> (let Msg (bottles-h X)
(do (output "~A on the wall~%~A~%Take one down, pass it around~%~A on the wall~%~%" Msg Msg (bottles-h (- X 1)))
(bottles (- X 1)))))</
==
<
when (n > 0)
prn n " bottles of beer on the wall"
Line 151 ⟶ 185:
prn n-1 " bottles of beer on the wall"
prn ""
beer n-1</
|