;; Onomatopoeettinen alkoholiliike -- Common LISP / CLOS - versio ;; Idea Ionilta,joka varasti sen Rennexiltä ;; Tän version väsäsi psilon, Herrain vuonna 2002. Vade retro, satanas. (defun repeat-seq (typesym n str) "Repeat a sequence N times. This implementation consumes more memory than strictly necessary." (let ((result str)) (loop for i from 2 to n do (setf result (concatenate typesym result str)) finally (return result)))) ;; pohjaluokka noille kaikille (defclass elucka () ((nimi :accessor elucka-nimi :initform "geneerinen elukka"))) (defmethod sano ((this elucka)) "geneerinen elukka ei sano mitään") (defmethod kuinka-sanoo ((this elucka) jotain) (let ((isonimi (copy-seq (elucka-nimi this))) (nimi (elucka-nimi this))) (setf (elt isonimi 0) (char-upcase (elt isonimi 0))) (let ((jonot (list (format nil "~%") (repeat-seq 'string 2 (format nil "~A sanoo ~A, ~A~%" isonimi (sano this) (sano this))) (format nil "Kuinka ~A sanoo, kuinka ~A sanoo,~%" nimi nimi) (format nil "kuinka ~A sanoo ~A?~%" nimi jotain) (format nil "~A sanoo ~A, ~A~%" isonimi (sano this) (sano this))))) (mapc (lambda (x) (princ x)) jonot)))) ;; loput eläimet (defclass kana (elucka) ((nimi :initform "kana"))) (defmethod sano ((this kana)) "kot kot kot") (defclass karhu (elucka) ((nimi :initform "karhu"))) (defmethod sano ((this karhu)) "mur mur mur") (defclass gorilla (elucka) ((nimi :initform "gorilla"))) (defmethod sano ((this gorilla)) "tätä ei kutsuta") (defmethod kuinka-sanoo ((this gorilla) jotain) (let ((output (concatenate 'string (format nil "~%Gorilla sanoo yääärrauhrhha~%") (format nil "Gorilla sanoo yhhrräähh rhähhrrääh~%") (format nil "Kuinka gorilla sanoo, kuinka gorilla sanoo,~%") (format nil "kuinka gorilla sanoo ~A?~%" jotain) (format nil "Gorilla sanoo öährrh - bundolo!~%")))) (princ output))) (defclass kirahvi (elucka) ((nimi :initform "kirahvi"))) (defmethod sano ((this kirahvi)) "öri öri öri") (defclass kiiski (elucka) ((nimi :initform "kiiski"))) (defmethod sano ((this kiiski)) "... ...") (defmethod kuinka-sanoo ((this kiiski) jotain) (call-next-method this jotain) (princ (format nil "... ..., ... ...~%"))) (defclass siittio (elucka) ((nimi :initform "siittio"))) (defmethod sano ((this siittio)) "ptlqm") (defmethod kuinka-sanoo ((this siittio) jotain) (call-next-method this jotain) (princ (format nil "ptlqm ptlqm, ptlqm ptlqm, ptl ptl, qm, ptlqm ptlqm...~%"))) (defun onomatopoeettinen-alkoholiliike () "Tulostaa Kontra-bändin kappaleen ``onomatopoeettinen alkoholiliike'' sanat." (princ (format nil "~%ONOMATOPOEETTINEN ALKOHOLILIIKE~%~%")) (mapc (lambda (x) (kuinka-sanoo (car x) (cdr x))) (list (cons (make-instance 'kana) "Cabana") (cons (make-instance 'karhu) "Karhu") (cons (make-instance 'gorilla) "Carillo"))) (princ (concatenate 'string (format nil "~%Ketulla on krapula, niin myös madolla.~%") (format nil "Kaikki ne voit tavata Alkon jonossa!~%"))) (kuinka-sanoo (make-instance 'kirahvi) "Kahvi! Likööri!") (princ (concatenate 'string (format nil "~%Siili käyttää aineita, niin myös etana.~%") (format nil "Heitä et voi tavata Alkon jonossa!~%"))) (mapc (lambda (x) (kuinka-sanoo (car x) (cdr x))) (list (cons (make-instance 'kiiski) "Whisky") (cons (make-instance 'siittio) "I love you")))) ;; sing us a song! (onomatopoeettinen-alkoholiliike)