Anonymous user
99 Bottles of Beer/Lisp: Difference between revisions
no edit summary
No edit summary |
imported>Rowsety Moid No edit summary |
||
(6 intermediate revisions by 5 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) (otw) (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)
(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:
▲-->
===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 95 ⟶ 126:
" bottles of beer on the wall" (rec ( - bottles 1))))(list bottles))
(rec 99)</
==
<syntaxhighlight lang="scheme">
(
(print n " bottles of beer on the wall,")▼
(print n " bottles of beer.")▼
▲ (print "Take one down, pass it around, ")
▲ (begin
(print "No more bottles of beer on the wall.")▼
▲ (print))
(begin▼
(print (- n 1) " bottles of beer on the wall,")▼
▲ (print)
▲ (loop (- n 1)))))
(for-each (lambda (n)
(print "No more bottles of beer on the wall,")▼
(let ((bottle (lambda (n) (if (eq? n 1) " bottle" " bottles")))
(print "Go to the store and buy some more,")▼
n (bottle n) " of beer." "\n"
"Take one down and pass it around, "
(if (eq? m 0) "no more" m)
(reverse (iota nn 1)))
(print
</syntaxhighlight>
==
<
(case N
(0 "No more beer")
Line 131 ⟶ 161:
(prinl "Take one down, pass it around,")
(prinl (bottles (dec 'N)) " on the wall.")
(prinl) )</
==
<
{ number --> string }
0 -> "No more beer"
Line 145 ⟶ 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 155 ⟶ 185:
prn n-1 " bottles of beer on the wall"
prn ""
beer n-1</
|