# HG changeset patch # User Steve Losh # Date 1473346416 0 # Node ID 87b80a1dabb28ee33fa2619e7b384cf681cc1e84 Initial project skeleton diff -r 000000000000 -r 87b80a1dabb2 .ffignore --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/.ffignore Thu Sep 08 14:53:36 2016 +0000 @@ -0,0 +1,1 @@ +docs/build diff -r 000000000000 -r 87b80a1dabb2 .hgignore --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/.hgignore Thu Sep 08 14:53:36 2016 +0000 @@ -0,0 +1,3 @@ +syntax: glob + +scratch.lisp diff -r 000000000000 -r 87b80a1dabb2 Makefile --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Makefile Thu Sep 08 14:53:36 2016 +0000 @@ -0,0 +1,7 @@ +.PHONY: vendor + +# Vendor ---------------------------------------------------------------------- +vendor/quickutils.lisp: vendor/make-quickutils.lisp + cd vendor && sbcl --noinform --load make-quickutils.lisp --eval '(quit)' + +vendor: vendor/quickutils.lisp diff -r 000000000000 -r 87b80a1dabb2 README.markdown --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/README.markdown Thu Sep 08 14:53:36 2016 +0000 @@ -0,0 +1,14 @@ + ,---. | | + `---.,---.. .| | , . + || | || | | | + `---'`---'`---'`---'`---'`---| + `---' + + Skinner: As you compound the lies, you compound the consequences for them. + Scully: All lies lead to the truth. + +Scully is a [General Game Player][ggp] for imperfect-information games. + +* **License:** MIT/X11 + +[ggp]: https://en.wikipedia.org/wiki/General_game_playing diff -r 000000000000 -r 87b80a1dabb2 package.lisp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/package.lisp Thu Sep 08 14:53:36 2016 +0000 @@ -0,0 +1,6 @@ +(defpackage #:scully + (:use + #:cl + #:scully.quickutils) + (:export + )) diff -r 000000000000 -r 87b80a1dabb2 scully.asd --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scully.asd Thu Sep 08 14:53:36 2016 +0000 @@ -0,0 +1,21 @@ +(asdf:defsystem #:scully + :name "scully" + :description "A General Game Player for imperfect-information games" + + :author "Steve Losh " + + :license "MIT/X11" + :version "1.0.0" + + :depends-on () + + :serial t + :components ((:module "vendor" + :serial t + :components ((:file "quickutils-package") + (:file "quickutils"))) + (:file "package") + (:module "src" + :serial t + :components ((:file "scully"))))) + diff -r 000000000000 -r 87b80a1dabb2 src/scully.lisp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/scully.lisp Thu Sep 08 14:53:36 2016 +0000 @@ -0,0 +1,1 @@ +(in-package #:scully) diff -r 000000000000 -r 87b80a1dabb2 vendor/make-quickutils.lisp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vendor/make-quickutils.lisp Thu Sep 08 14:53:36 2016 +0000 @@ -0,0 +1,11 @@ +(ql:quickload 'quickutil) + +(qtlc:save-utils-as + "quickutils.lisp" + :utilities '( + + :with-gensyms + :once-only + + ) + :package "SCULLY.QUICKUTILS") diff -r 000000000000 -r 87b80a1dabb2 vendor/quickutils-package.lisp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vendor/quickutils-package.lisp Thu Sep 08 14:53:36 2016 +0000 @@ -0,0 +1,12 @@ +(eval-when (:compile-toplevel :load-toplevel :execute) + (unless (find-package "SCULLY.QUICKUTILS") + (defpackage "SCULLY.QUICKUTILS" + (:documentation "Package that contains Quickutil utility functions.") + (:use #:cl)))) + +(in-package "SCULLY.QUICKUTILS") + +;; need to define this here so sbcl will shut the hell up about it being +;; undefined when compiling quickutils.lisp. computers are trash. +(defparameter *utilities* nil) + diff -r 000000000000 -r 87b80a1dabb2 vendor/quickutils.lisp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vendor/quickutils.lisp Thu Sep 08 14:53:36 2016 +0000 @@ -0,0 +1,112 @@ +;;;; This file was automatically generated by Quickutil. +;;;; See http://quickutil.org for details. + +;;;; To regenerate: +;;;; (qtlc:save-utils-as "quickutils.lisp" :utilities '(:WITH-GENSYMS :ONCE-ONLY) :ensure-package T :package "SCULLY.QUICKUTILS") + +(eval-when (:compile-toplevel :load-toplevel :execute) + (unless (find-package "SCULLY.QUICKUTILS") + (defpackage "SCULLY.QUICKUTILS" + (:documentation "Package that contains Quickutil utility functions.") + (:use #:cl)))) + +(in-package "SCULLY.QUICKUTILS") + +(when (boundp '*utilities*) + (setf *utilities* (union *utilities* '(:STRING-DESIGNATOR :WITH-GENSYMS + :MAKE-GENSYM-LIST :ONCE-ONLY)))) + + (deftype string-designator () + "A string designator type. A string designator is either a string, a symbol, +or a character." + `(or symbol string character)) + + + (defmacro with-gensyms (names &body forms) + "Binds each variable named by a symbol in `names` to a unique symbol around +`forms`. Each of `names` must either be either a symbol, or of the form: + + (symbol string-designator) + +Bare symbols appearing in `names` are equivalent to: + + (symbol symbol) + +The string-designator is used as the argument to `gensym` when constructing the +unique symbol the named variable will be bound to." + `(let ,(mapcar (lambda (name) + (multiple-value-bind (symbol string) + (etypecase name + (symbol + (values name (symbol-name name))) + ((cons symbol (cons string-designator null)) + (values (first name) (string (second name))))) + `(,symbol (gensym ,string)))) + names) + ,@forms)) + + (defmacro with-unique-names (names &body forms) + "Binds each variable named by a symbol in `names` to a unique symbol around +`forms`. Each of `names` must either be either a symbol, or of the form: + + (symbol string-designator) + +Bare symbols appearing in `names` are equivalent to: + + (symbol symbol) + +The string-designator is used as the argument to `gensym` when constructing the +unique symbol the named variable will be bound to." + `(with-gensyms ,names ,@forms)) + +(eval-when (:compile-toplevel :load-toplevel :execute) + (defun make-gensym-list (length &optional (x "G")) + "Returns a list of `length` gensyms, each generated as if with a call to `make-gensym`, +using the second (optional, defaulting to `\"G\"`) argument." + (let ((g (if (typep x '(integer 0)) x (string x)))) + (loop repeat length + collect (gensym g)))) + ) ; eval-when + + (defmacro once-only (specs &body forms) + "Evaluates `forms` with symbols specified in `specs` rebound to temporary +variables, ensuring that each initform is evaluated only once. + +Each of `specs` must either be a symbol naming the variable to be rebound, or of +the form: + + (symbol initform) + +Bare symbols in `specs` are equivalent to + + (symbol symbol) + +Example: + + (defmacro cons1 (x) (once-only (x) `(cons ,x ,x))) + (let ((y 0)) (cons1 (incf y))) => (1 . 1)" + (let ((gensyms (make-gensym-list (length specs) "ONCE-ONLY")) + (names-and-forms (mapcar (lambda (spec) + (etypecase spec + (list + (destructuring-bind (name form) spec + (cons name form))) + (symbol + (cons spec spec)))) + specs))) + ;; bind in user-macro + `(let ,(mapcar (lambda (g n) (list g `(gensym ,(string (car n))))) + gensyms names-and-forms) + ;; bind in final expansion + `(let (,,@(mapcar (lambda (g n) + ``(,,g ,,(cdr n))) + gensyms names-and-forms)) + ;; bind in user-macro + ,(let ,(mapcar (lambda (n g) (list (car n) g)) + names-and-forms gensyms) + ,@forms))))) + +(eval-when (:compile-toplevel :load-toplevel :execute) + (export '(with-gensyms with-unique-names once-only))) + +;;;; END OF quickutils.lisp ;;;;