RosettaCodeData/Task/Naming-conventions/Common-Lisp/naming-conventions-1.lisp
2023-07-01 13:44:08 -04:00

34 lines
892 B
Common Lisp

(defvar *language* :en
"The language to use for messages (defaults to English)")
(defmacro with-language ((language) &body body)
"Locally binds *LANGUAGE* to LANGUAGE"
`(let ((*language* ,language))
,@body))
(defgeneric complain% (language about)
;; The % indicates this is an “internal” implementation detail.
(:method ((language (eql :en)) (about (eql :weather)))
"It's too cold in winter"))
(defun complain (about)
"Complain about something indicated by ABOUT"
(princ (complain% *language* about) *error-output*)
(terpri *error-output*)
(finish-output *error-output*)
nil)
(defmethod complain% ((language (eql :es)) (about (eql :weather)))
"Hace demasiado frío en invierno")
(complain :weather)
(with-language (:es)
(complain :weather))
(complain :weather)
It's too cold in winter
Hace demasiado frío en invierno
It's too cold in winter