r5141: Auto commit for Debian build
[reversi.git] / utils.lisp
1 ;;;;***************************************************************************
2 ;;;;
3 ;;;; FILE IDENTIFICATION
4 ;;;; 
5 ;;;;  Name:           reversi-base.lisp
6 ;;;;  Purpose:        Basic functions for reversi
7 ;;;;  Programer:      Kevin M. Rosenberg
8 ;;;;  Date Started:   1 Nov 2001
9 ;;;;
10 ;;;; $Id: utils.lisp,v 1.6 2003/06/12 13:08:43 kevin Exp $
11 ;;;;
12 ;;;; This file is Copyright (c) 2001-2003 by Kevin M. Rosenberg 
13 ;;;;
14 ;;;; Reversi users are granted the rights to distribute and use this software
15 ;;;; as governed by the terms of the Lisp Lesser GNU Public License
16 ;;;; (http://opensource.franz.com/preamble.html), also known as the LLGPL.
17 ;;;;***************************************************************************
18
19 (in-package #:reversi)
20
21
22 (defmacro missing-argument ()
23   `(error "Missing an argument to a constructor"))
24
25 ;; Anaphoric macros
26
27 (defmacro aif (test then &optional else)
28   `(let ((it ,test))
29      (if it ,then ,else)))
30
31 (defmacro awhen (test-form &body body)
32   `(aif ,test-form
33         (progn ,@body)))
34
35 (defmacro awhile (expr &body body)
36   `(do ((it ,expr ,expr))
37        ((not it))
38      ,@body))
39
40 (defun mappend (fn list)
41   "Append the results of calling fn on each element of list.
42   Like mapcon, but uses append instead of nconc."
43   (apply #'append (mapcar fn list)))
44
45 (defun random-nth (seq)
46   (declare (list seq))
47   "Pick a random element out of a sequence."
48   (nth (random (length seq)) nth))
49
50 (defun concat-symbol (&rest args)
51   "Concatenate symbols or strings to form an interned symbol"
52   (intern (format nil "~{~a~}" args)))
53
54 (defun cross-product (fn xlist ylist)
55   "Return a list of all (fn x y) values."
56   (mappend #'(lambda (y)
57                (mapcar #'(lambda (x) (funcall fn x y))
58                        xlist))
59            ylist))
60
61
62 (defmacro until (test &body body)
63   `(do ()
64        (,test)
65      ,@body))
66
67 (defmacro while (test &body body)
68   `(do ()
69        ((not ,test))
70      ,@body))
71
72 #+excl
73 (defun list-to-delimited-string (list &optional (separator #\space))
74   (excl:list-to-delimited-string list separator))
75
76 #-excl
77 (defun list-to-delimited-string (list &optional (separator #\space))
78   (let ((output (when list (format nil "~A" (car list)))))
79     (dolist (obj (rest list))
80       (setq output (concatenate 'string output
81                                 (format nil "~A" separator)
82                                 (format nil "~A" obj))))
83     output))
84
85
86