Initial commit with RPS functionality
This commit is contained in:
commit
afd422039f
|
@ -0,0 +1,65 @@
|
||||||
|
*.eps
|
||||||
|
*.go
|
||||||
|
*.log
|
||||||
|
*.pdf
|
||||||
|
*.png
|
||||||
|
*.tar.xz
|
||||||
|
*.tar.gz
|
||||||
|
*.tmp
|
||||||
|
*~
|
||||||
|
.#*
|
||||||
|
\#*\#
|
||||||
|
,*
|
||||||
|
/ABOUT-NLS
|
||||||
|
/INSTALL
|
||||||
|
/aclocal.m4
|
||||||
|
/autom4te.cache
|
||||||
|
/build-aux/ar-lib
|
||||||
|
/build-aux/compile
|
||||||
|
/build-aux/config.guess
|
||||||
|
/build-aux/config.rpath
|
||||||
|
/build-aux/config.sub
|
||||||
|
/build-aux/depcomp
|
||||||
|
/build-aux/install-sh
|
||||||
|
/build-aux/mdate-sh
|
||||||
|
/build-aux/missing
|
||||||
|
/build-aux/test-driver
|
||||||
|
/build-aux/texinfo.tex
|
||||||
|
/config.status
|
||||||
|
/configure
|
||||||
|
/doc/*.1
|
||||||
|
/doc/.dirstamp
|
||||||
|
/doc/contributing.*.texi
|
||||||
|
/doc/*.aux
|
||||||
|
/doc/*.cp
|
||||||
|
/doc/*.cps
|
||||||
|
/doc/*.fn
|
||||||
|
/doc/*.fns
|
||||||
|
/doc/*.html
|
||||||
|
/doc/*.info
|
||||||
|
/doc/*.info-[0-9]
|
||||||
|
/doc/*.ky
|
||||||
|
/doc/*.pg
|
||||||
|
/doc/*.toc
|
||||||
|
/doc/*.t2p
|
||||||
|
/doc/*.tp
|
||||||
|
/doc/*.vr
|
||||||
|
/doc/*.vrs
|
||||||
|
/doc/stamp-vti
|
||||||
|
/doc/version.texi
|
||||||
|
/doc/version-*.texi
|
||||||
|
/m4/*
|
||||||
|
/pre-inst-env
|
||||||
|
/test-env
|
||||||
|
/test-tmp
|
||||||
|
/tests/*.trs
|
||||||
|
GPATH
|
||||||
|
GRTAGS
|
||||||
|
GTAGS
|
||||||
|
Makefile
|
||||||
|
Makefile.in
|
||||||
|
config.cache
|
||||||
|
stamp-h[0-9]
|
||||||
|
tmp
|
||||||
|
/.version
|
||||||
|
/doc/stamp-[0-9]
|
|
@ -0,0 +1,3 @@
|
||||||
|
Contributers to Gib-Gab-Gob 0.1:
|
||||||
|
|
||||||
|
Vivi Langdon <INSERT EMAIL HERE>
|
|
@ -0,0 +1,3 @@
|
||||||
|
This project's license is GPL 3+.
|
||||||
|
|
||||||
|
You can read the full license at https://www.gnu.org/licenses/gpl.html.
|
|
@ -0,0 +1 @@
|
||||||
|
For a complete log, please see the Git commit log at <https://solarpunk.moe/PATH/TO/LOG>.
|
|
@ -0,0 +1,47 @@
|
||||||
|
# -*- mode: org; coding: utf-8; -*-
|
||||||
|
|
||||||
|
#+TITLE: Hacking gib-gab-gob
|
||||||
|
|
||||||
|
* Contributing
|
||||||
|
|
||||||
|
By far the easiest way to hack on gib-gab-gob is to develop using Guix:
|
||||||
|
|
||||||
|
#+BEGIN_SRC bash
|
||||||
|
# Obtain the source code
|
||||||
|
cd /path/to/source-code
|
||||||
|
guix environment -l guix.scm
|
||||||
|
# In the new shell, run:
|
||||||
|
hall dist --execute && autoreconf -vif && ./configure && make check
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
|
You can now hack this project's files to your heart's content, whilst
|
||||||
|
testing them from your `guix environment' shell.
|
||||||
|
|
||||||
|
To try out any scripts in the project you can now use
|
||||||
|
|
||||||
|
#+BEGIN_SRC bash
|
||||||
|
./pre-inst-env scripts/${script-name}
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
|
If you'd like to tidy the project again, but retain the ability to test the
|
||||||
|
project from the commandline, simply run:
|
||||||
|
|
||||||
|
#+BEGIN_SRC bash
|
||||||
|
./hall clean --skip "scripts/${script-name},pre-inst-env" --execute
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
|
** Manual Installation
|
||||||
|
|
||||||
|
If you do not yet use Guix, you will have to install this project's
|
||||||
|
dependencies manually:
|
||||||
|
- autoconf
|
||||||
|
- automake
|
||||||
|
- pkg-config
|
||||||
|
- texinfo
|
||||||
|
- guile-hall
|
||||||
|
|
||||||
|
Once those dependencies are installed you can run:
|
||||||
|
|
||||||
|
#+BEGIN_SRC bash
|
||||||
|
hall dist -x && autoreconf -vif && ./configure && make check
|
||||||
|
#+END_SRC
|
|
@ -0,0 +1,73 @@
|
||||||
|
bin_SCRIPTS =
|
||||||
|
|
||||||
|
# Handle substitution of fully-expanded Autoconf variables.
|
||||||
|
do_subst = $(SED) \
|
||||||
|
-e 's,[@]GUILE[@],$(GUILE),g' \
|
||||||
|
-e 's,[@]guilemoduledir[@],$(guilemoduledir),g' \
|
||||||
|
-e 's,[@]guileobjectdir[@],$(guileobjectdir),g' \
|
||||||
|
-e 's,[@]localedir[@],$(localedir),g'
|
||||||
|
|
||||||
|
nodist_noinst_SCRIPTS = pre-inst-env
|
||||||
|
|
||||||
|
GOBJECTS = $(SOURCES:%.scm=%.go)
|
||||||
|
|
||||||
|
moddir=$(prefix)/share/guile/site/$(GUILE_EFFECTIVE_VERSION)
|
||||||
|
godir=$(libdir)/guile/$(GUILE_EFFECTIVE_VERSION)/site-ccache
|
||||||
|
ccachedir=$(libdir)/guile/$(GUILE_EFFECTIVE_VERSION)/site-ccache
|
||||||
|
|
||||||
|
nobase_mod_DATA = $(SOURCES) $(NOCOMP_SOURCES)
|
||||||
|
nobase_go_DATA = $(GOBJECTS)
|
||||||
|
|
||||||
|
# Make sure source files are installed first, so that the mtime of
|
||||||
|
# installed compiled files is greater than that of installed source
|
||||||
|
# files. See
|
||||||
|
# <http://lists.gnu.org/archive/html/guile-devel/2010-07/msg00125.html>
|
||||||
|
# for details.
|
||||||
|
guile_install_go_files = install-nobase_goDATA
|
||||||
|
$(guile_install_go_files): install-nobase_modDATA
|
||||||
|
|
||||||
|
EXTRA_DIST = $(SOURCES) $(NOCOMP_SOURCES)
|
||||||
|
GUILE_WARNINGS = -Wunbound-variable -Warity-mismatch -Wformat
|
||||||
|
SUFFIXES = .scm .go
|
||||||
|
.scm.go:
|
||||||
|
$(AM_V_GEN)$(top_builddir)/pre-inst-env $(GUILE_TOOLS) compile $(GUILE_WARNINGS) -o "$@" "$<"
|
||||||
|
|
||||||
|
SOURCES = gib-gab-gob/rps.scm \
|
||||||
|
gib-gab-gob/actors.scm
|
||||||
|
|
||||||
|
TESTS =
|
||||||
|
|
||||||
|
TEST_EXTENSIONS = .scm
|
||||||
|
SCM_LOG_DRIVER = \
|
||||||
|
$(top_builddir)/pre-inst-env \
|
||||||
|
$(GUILE) --no-auto-compile -e main \
|
||||||
|
$(top_srcdir)/build-aux/test-driver.scm
|
||||||
|
|
||||||
|
# Tell 'build-aux/test-driver.scm' to display only source file names,
|
||||||
|
# not indivdual test names.
|
||||||
|
AM_SCM_LOG_DRIVER_FLAGS = --brief=yes
|
||||||
|
|
||||||
|
AM_SCM_LOG_FLAGS = --no-auto-compile -L "$(top_srcdir)"
|
||||||
|
|
||||||
|
AM_TESTS_ENVIRONMENT = abs_top_srcdir="$(abs_top_srcdir)"
|
||||||
|
|
||||||
|
info_TEXINFOS = doc/gib-gab-gob.texi
|
||||||
|
dvi: # Don't build dvi docs
|
||||||
|
|
||||||
|
EXTRA_DIST += README \
|
||||||
|
HACKING \
|
||||||
|
COPYING \
|
||||||
|
.gitignore \
|
||||||
|
hall.scm \
|
||||||
|
build-aux/test-driver.scm \
|
||||||
|
$(TESTS)
|
||||||
|
|
||||||
|
ACLOCAL_AMFLAGS = -I m4
|
||||||
|
|
||||||
|
clean-go:
|
||||||
|
-$(RM) $(GOBJECTS)
|
||||||
|
.PHONY: clean-go
|
||||||
|
|
||||||
|
CLEANFILES = \
|
||||||
|
$(GOBJECTS) \
|
||||||
|
$(TESTS:tests/%.scm=%.log)
|
|
@ -0,0 +1,14 @@
|
||||||
|
# -*- mode: org; coding: utf-8; -*-
|
||||||
|
|
||||||
|
#+TITLE: Gib-Gab-Gob NEWS ? history of user-visible changes
|
||||||
|
#+STARTUP: content hidestars
|
||||||
|
|
||||||
|
Copyright ? (2023) Vivi Langdon <INSERT EMAIL HERE>
|
||||||
|
|
||||||
|
Copying and distribution of this file, with or without modification,
|
||||||
|
are permitted in any medium without royalty provided the copyright
|
||||||
|
notice and this notice are preserved.
|
||||||
|
|
||||||
|
Please send Gib-Gab-Gob bug reports to INSERT EMAIL HERE.
|
||||||
|
|
||||||
|
* Publication at 0.1
|
|
@ -0,0 +1,2 @@
|
||||||
|
* Gib Gab Gob
|
||||||
|
** It's Rock Paper Scissors, but for Goblins
|
|
@ -0,0 +1,2 @@
|
||||||
|
* Gib Gab Gob
|
||||||
|
** It's Rock Paper Scissors, but for Goblins
|
|
@ -0,0 +1,179 @@
|
||||||
|
;;;; test-driver.scm - Guile test driver for Automake testsuite harness
|
||||||
|
|
||||||
|
(define script-version "2019-01-15.13") ;UTC
|
||||||
|
|
||||||
|
;;; Copyright ? 2015, 2016 Mathieu Lirzin <mthl@gnu.org>
|
||||||
|
;;; Copyright ? 2019 Alex Sassmannshausen <alex@pompo.co>
|
||||||
|
;;;
|
||||||
|
;;; This program is free software; you can redistribute it and/or modify it
|
||||||
|
;;; under the terms of the GNU General Public License as published by
|
||||||
|
;;; the Free Software Foundation; either version 3 of the License, or (at
|
||||||
|
;;; your option) any later version.
|
||||||
|
;;;
|
||||||
|
;;; This program is distributed in the hope that it will be useful, but
|
||||||
|
;;; WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
;;; GNU General Public License for more details.
|
||||||
|
;;;
|
||||||
|
;;; You should have received a copy of the GNU General Public License
|
||||||
|
;;; along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
;;;; Commentary:
|
||||||
|
;;;
|
||||||
|
;;; This script provides a Guile test driver using the SRFI-64 Scheme API for
|
||||||
|
;;; test suites. SRFI-64 is distributed with Guile since version 2.0.9.
|
||||||
|
;;;
|
||||||
|
;;; This script is a lightly modified version of the orignal written by
|
||||||
|
;;; Matthieu Lirzin. The changes make it suitable for use as part of the
|
||||||
|
;;; guile-hall infrastructure.
|
||||||
|
;;;
|
||||||
|
;;;; Code:
|
||||||
|
|
||||||
|
(use-modules (ice-9 getopt-long)
|
||||||
|
(ice-9 pretty-print)
|
||||||
|
(srfi srfi-26)
|
||||||
|
(srfi srfi-64))
|
||||||
|
|
||||||
|
(define (show-help)
|
||||||
|
(display "Usage:
|
||||||
|
test-driver --test-name=NAME --log-file=PATH --trs-file=PATH
|
||||||
|
[--expect-failure={yes|no}] [--color-tests={yes|no}]
|
||||||
|
[--enable-hard-errors={yes|no}] [--brief={yes|no}}] [--]
|
||||||
|
TEST-SCRIPT [TEST-SCRIPT-ARGUMENTS]
|
||||||
|
The '--test-name', '--log-file' and '--trs-file' options are mandatory.
|
||||||
|
"))
|
||||||
|
|
||||||
|
(define %options
|
||||||
|
'((test-name (value #t))
|
||||||
|
(log-file (value #t))
|
||||||
|
(trs-file (value #t))
|
||||||
|
(color-tests (value #t))
|
||||||
|
(expect-failure (value #t)) ;XXX: not implemented yet
|
||||||
|
(enable-hard-errors (value #t)) ;not implemented in SRFI-64
|
||||||
|
(brief (value #t))
|
||||||
|
(help (single-char #\h) (value #f))
|
||||||
|
(version (single-char #\V) (value #f))))
|
||||||
|
|
||||||
|
(define (option->boolean options key)
|
||||||
|
"Return #t if the value associated with KEY in OPTIONS is 'yes'."
|
||||||
|
(and=> (option-ref options key #f) (cut string=? <> "yes")))
|
||||||
|
|
||||||
|
(define* (test-display field value #:optional (port (current-output-port))
|
||||||
|
#:key pretty?)
|
||||||
|
"Display 'FIELD: VALUE\n' on PORT."
|
||||||
|
(if pretty?
|
||||||
|
(begin
|
||||||
|
(format port "~A:~%" field)
|
||||||
|
(pretty-print value port #:per-line-prefix "+ "))
|
||||||
|
(format port "~A: ~S~%" field value)))
|
||||||
|
|
||||||
|
(define* (result->string symbol #:key colorize?)
|
||||||
|
"Return SYMBOL as an upper case string. Use colors when COLORIZE is #t."
|
||||||
|
(let ((result (string-upcase (symbol->string symbol))))
|
||||||
|
(if colorize?
|
||||||
|
(string-append (case symbol
|
||||||
|
((pass) "[0;32m") ;green
|
||||||
|
((xfail) "[1;32m") ;light green
|
||||||
|
((skip) "[1;34m") ;blue
|
||||||
|
((fail xpass) "[0;31m") ;red
|
||||||
|
((error) "[0;35m")) ;magenta
|
||||||
|
result
|
||||||
|
"[m") ;no color
|
||||||
|
result)))
|
||||||
|
|
||||||
|
(define* (test-runner-gnu test-name #:key color? brief? out-port trs-port)
|
||||||
|
"Return an custom SRFI-64 test runner. TEST-NAME is a string specifying the
|
||||||
|
file name of the current the test. COLOR? specifies whether to use colors,
|
||||||
|
and BRIEF?, well, you know. OUT-PORT and TRS-PORT must be output ports. The
|
||||||
|
current output port is supposed to be redirected to a '.log' file."
|
||||||
|
|
||||||
|
(define (test-on-test-begin-gnu runner)
|
||||||
|
;; Procedure called at the start of an individual test case, before the
|
||||||
|
;; test expression (and expected value) are evaluated.
|
||||||
|
(let ((result (cute assq-ref (test-result-alist runner) <>)))
|
||||||
|
(format #t "test-name: ~A~%" (result 'test-name))
|
||||||
|
(format #t "location: ~A~%"
|
||||||
|
(string-append (result 'source-file) ":"
|
||||||
|
(number->string (result 'source-line))))
|
||||||
|
(test-display "source" (result 'source-form) #:pretty? #t)))
|
||||||
|
|
||||||
|
(define (test-on-test-end-gnu runner)
|
||||||
|
;; Procedure called at the end of an individual test case, when the result
|
||||||
|
;; of the test is available.
|
||||||
|
(let* ((results (test-result-alist runner))
|
||||||
|
(result? (cut assq <> results))
|
||||||
|
(result (cut assq-ref results <>)))
|
||||||
|
(unless brief?
|
||||||
|
;; Display the result of each test case on the console.
|
||||||
|
(format out-port "~A: ~A - ~A~%"
|
||||||
|
(result->string (test-result-kind runner) #:colorize? color?)
|
||||||
|
test-name (test-runner-test-name runner)))
|
||||||
|
(when (result? 'expected-value)
|
||||||
|
(test-display "expected-value" (result 'expected-value)))
|
||||||
|
(when (result? 'expected-error)
|
||||||
|
(test-display "expected-error" (result 'expected-error) #:pretty? #t))
|
||||||
|
(when (result? 'actual-value)
|
||||||
|
(test-display "actual-value" (result 'actual-value)))
|
||||||
|
(when (result? 'actual-error)
|
||||||
|
(test-display "actual-error" (result 'actual-error) #:pretty? #t))
|
||||||
|
(format #t "result: ~a~%" (result->string (result 'result-kind)))
|
||||||
|
(newline)
|
||||||
|
(format trs-port ":test-result: ~A ~A~%"
|
||||||
|
(result->string (test-result-kind runner))
|
||||||
|
(test-runner-test-name runner))))
|
||||||
|
|
||||||
|
(define (test-on-group-end-gnu runner)
|
||||||
|
;; Procedure called by a 'test-end', including at the end of a test-group.
|
||||||
|
(let ((fail (or (positive? (test-runner-fail-count runner))
|
||||||
|
(positive? (test-runner-xpass-count runner))))
|
||||||
|
(skip (or (positive? (test-runner-skip-count runner))
|
||||||
|
(positive? (test-runner-xfail-count runner)))))
|
||||||
|
;; XXX: The global results need some refinements for XPASS.
|
||||||
|
(format trs-port ":global-test-result: ~A~%"
|
||||||
|
(if fail "FAIL" (if skip "SKIP" "PASS")))
|
||||||
|
(format trs-port ":recheck: ~A~%"
|
||||||
|
(if fail "yes" "no"))
|
||||||
|
(format trs-port ":copy-in-global-log: ~A~%"
|
||||||
|
(if (or fail skip) "yes" "no"))
|
||||||
|
(when brief?
|
||||||
|
;; Display the global test group result on the console.
|
||||||
|
(format out-port "~A: ~A~%"
|
||||||
|
(result->string (if fail 'fail (if skip 'skip 'pass))
|
||||||
|
#:colorize? color?)
|
||||||
|
test-name))
|
||||||
|
#f))
|
||||||
|
|
||||||
|
(let ((runner (test-runner-null)))
|
||||||
|
(test-runner-on-test-begin! runner test-on-test-begin-gnu)
|
||||||
|
(test-runner-on-test-end! runner test-on-test-end-gnu)
|
||||||
|
(test-runner-on-group-end! runner test-on-group-end-gnu)
|
||||||
|
(test-runner-on-bad-end-name! runner test-on-bad-end-name-simple)
|
||||||
|
runner))
|
||||||
|
|
||||||
|
;;;
|
||||||
|
;;; Entry point.
|
||||||
|
;;;
|
||||||
|
|
||||||
|
(define (main . args)
|
||||||
|
(let* ((opts (getopt-long (command-line) %options))
|
||||||
|
(option (cut option-ref opts <> <>)))
|
||||||
|
(cond
|
||||||
|
((option 'help #f) (show-help))
|
||||||
|
((option 'version #f) (format #t "test-driver.scm ~A" script-version))
|
||||||
|
(else
|
||||||
|
(let ((log (open-file (option 'log-file "") "w0"))
|
||||||
|
(trs (open-file (option 'trs-file "") "wl"))
|
||||||
|
(out (duplicate-port (current-output-port) "wl")))
|
||||||
|
(redirect-port log (current-output-port))
|
||||||
|
(redirect-port log (current-warning-port))
|
||||||
|
(redirect-port log (current-error-port))
|
||||||
|
(test-with-runner
|
||||||
|
(test-runner-gnu (option 'test-name #f)
|
||||||
|
#:color? (option->boolean opts 'color-tests)
|
||||||
|
#:brief? (option->boolean opts 'brief)
|
||||||
|
#:out-port out #:trs-port trs)
|
||||||
|
(load-from-path (option 'test-name #f)))
|
||||||
|
(close-port log)
|
||||||
|
(close-port trs)
|
||||||
|
(close-port out))))
|
||||||
|
(exit 0)))
|
|
@ -0,0 +1,34 @@
|
||||||
|
dnl -*- Autoconf -*-
|
||||||
|
|
||||||
|
AC_INIT(gib-gab-gob, 0.1)
|
||||||
|
AC_SUBST(HVERSION, "\"0.1\"")
|
||||||
|
AC_SUBST(AUTHOR, "\"Vivi Langdon\"")
|
||||||
|
AC_SUBST(COPYRIGHT, "'(2023)")
|
||||||
|
AC_SUBST(LICENSE, gpl3+)
|
||||||
|
AC_CONFIG_SRCDIR(gib-gab-gob)
|
||||||
|
AC_CONFIG_AUX_DIR([build-aux])
|
||||||
|
AM_INIT_AUTOMAKE([1.12 gnu silent-rules subdir-objects color-tests parallel-tests -Woverride -Wno-portability])
|
||||||
|
AM_SILENT_RULES([yes])
|
||||||
|
|
||||||
|
AC_CONFIG_FILES([Makefile])
|
||||||
|
AC_CONFIG_FILES([pre-inst-env], [chmod +x pre-inst-env])
|
||||||
|
|
||||||
|
dnl Search for 'guile' and 'guild'. This macro defines
|
||||||
|
dnl 'GUILE_EFFECTIVE_VERSION'.
|
||||||
|
GUILE_PKG([3.0 2.2 2.0])
|
||||||
|
GUILE_PROGS
|
||||||
|
GUILE_SITE_DIR
|
||||||
|
if test "x$GUILD" = "x"; then
|
||||||
|
AC_MSG_ERROR(['guild' binary not found; please check your guile-2.x installation.])
|
||||||
|
fi
|
||||||
|
|
||||||
|
dnl Hall auto-generated guile-module dependencies
|
||||||
|
GUILE_MODULE_REQUIRED([goblins])
|
||||||
|
|
||||||
|
dnl Installation directories for .scm and .go files.
|
||||||
|
guilemoduledir="${datarootdir}/guile/site/$GUILE_EFFECTIVE_VERSION"
|
||||||
|
guileobjectdir="${libdir}/guile/$GUILE_EFFECTIVE_VERSION/site-ccache"
|
||||||
|
AC_SUBST([guilemoduledir])
|
||||||
|
AC_SUBST([guileobjectdir])
|
||||||
|
|
||||||
|
AC_OUTPUT
|
|
@ -0,0 +1,60 @@
|
||||||
|
\input texinfo
|
||||||
|
@c -*-texinfo-*-
|
||||||
|
|
||||||
|
@c %**start of header
|
||||||
|
@setfilename gib-gab-gob.info
|
||||||
|
@documentencoding UTF-8
|
||||||
|
@settitle Gib-Gab-Gob Reference Manual
|
||||||
|
@c %**end of header
|
||||||
|
|
||||||
|
@include version.texi
|
||||||
|
|
||||||
|
@copying
|
||||||
|
Copyright @copyright{} 2023 Vivi Langdon
|
||||||
|
|
||||||
|
Permission is granted to copy, distribute and/or modify this document
|
||||||
|
under the terms of the GNU Free Documentation License, Version 1.3 or
|
||||||
|
any later version published by the Free Software Foundation; with no
|
||||||
|
Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A
|
||||||
|
copy of the license is included in the section entitled ``GNU Free
|
||||||
|
Documentation License''.
|
||||||
|
@end copying
|
||||||
|
|
||||||
|
@dircategory The Algorithmic Language Scheme
|
||||||
|
@direntry
|
||||||
|
* Gib-Gab-Gob: (gib-gab-gob).
|
||||||
|
@end direntry
|
||||||
|
|
||||||
|
@titlepage
|
||||||
|
@title The Gib-Gab-Gob Manual
|
||||||
|
@author Vivi Langdon
|
||||||
|
|
||||||
|
@page
|
||||||
|
@vskip 0pt plus 1filll
|
||||||
|
Edition @value{EDITION} @*
|
||||||
|
@value{UPDATED} @*
|
||||||
|
|
||||||
|
@insertcopying
|
||||||
|
@end titlepage
|
||||||
|
|
||||||
|
@contents
|
||||||
|
|
||||||
|
@c *********************************************************************
|
||||||
|
@node Top
|
||||||
|
@top Gib-Gab-Gob
|
||||||
|
|
||||||
|
This document describes Gib-Gab-Gob version @value{VERSION}.
|
||||||
|
|
||||||
|
@menu
|
||||||
|
* Introduction:: Why Gib-Gab-Gob?
|
||||||
|
@end menu
|
||||||
|
|
||||||
|
@c *********************************************************************
|
||||||
|
@node Introduction
|
||||||
|
@chapter Introduction
|
||||||
|
|
||||||
|
INTRODUCTION HERE
|
||||||
|
|
||||||
|
This documentation is a stub.
|
||||||
|
|
||||||
|
@bye
|
|
@ -0,0 +1,28 @@
|
||||||
|
(define-module (gib-gab-gob actors)
|
||||||
|
#:use-module (gib-gab-gob rps)
|
||||||
|
#:use-module (goblins)
|
||||||
|
#:use-module (goblins actor-lib methods)
|
||||||
|
#:use-module (goblins actor-lib sealers)
|
||||||
|
#:use-module (oop goops)
|
||||||
|
#:export (^rps ^client-picker))
|
||||||
|
|
||||||
|
(define* (^rps bcom)
|
||||||
|
(define pick 'scissors)
|
||||||
|
(methods
|
||||||
|
((register-opponent name client sealed-pick)
|
||||||
|
(format #t "Hey there, ~a! You sent me your pick of rock-paper-scissors; now I will send mine.\n" name)
|
||||||
|
;; server always picks scissors, it's the best strat
|
||||||
|
(on (<- (<- client 'exchange-pick-for-unsealer pick) sealed-pick)
|
||||||
|
(lambda (peer-pick)
|
||||||
|
(format #t "The peer has picked ~a (do I win? ~s)\n" peer-pick (rps-winner pick peer-pick)))))))
|
||||||
|
|
||||||
|
(define (^client-picker bcom)
|
||||||
|
(define-values (seal-pick unseal-pick my-pick?)
|
||||||
|
(spawn-sealer-triplet))
|
||||||
|
(define pick 'rock)
|
||||||
|
(methods
|
||||||
|
;; client always picks rock, it's the real good strat
|
||||||
|
((get-sealed-pick) ($ seal-pick pick))
|
||||||
|
((exchange-pick-for-unsealer peer-pick)
|
||||||
|
(format #t "Peer picked ~a... (do I win? ~s), i will send my unsealer\n" peer-pick (rps-winner pick peer-pick))
|
||||||
|
unseal-pick)))
|
|
@ -0,0 +1,72 @@
|
||||||
|
(define-module (gib-gab-gob rps)
|
||||||
|
#:use-module (gib-gab-gob actors)
|
||||||
|
#:use-module (ice-9 match)
|
||||||
|
#:use-module (goblins)
|
||||||
|
#:use-module (goblins ocapn captp)
|
||||||
|
#:use-module (goblins ocapn ids)
|
||||||
|
#:use-module (goblins ocapn netlayer testuds)
|
||||||
|
#:use-module (oop goops)
|
||||||
|
#:export (do-rps join-rps rps-winner rock-paper-scissors))
|
||||||
|
|
||||||
|
(define-class <rps-host> ()
|
||||||
|
(vat #:accessor vat)
|
||||||
|
(rps #:accessor rps)
|
||||||
|
(user-name #:accessor user-name #:init-keyword #:user-name)
|
||||||
|
(ocapn-vat #:getter ocapn-vat #:init-thunk spawn-vat))
|
||||||
|
|
||||||
|
(define-method (init (host <rps-host>))
|
||||||
|
(set! (vat host) (spawn-vat))
|
||||||
|
(with-vat (vat host)
|
||||||
|
(set! (rps host)
|
||||||
|
(spawn ^rps)))
|
||||||
|
(with-vat (ocapn-vat host)
|
||||||
|
(define uds-netlayer (new-testuds-netlayer))
|
||||||
|
(define mycapn (spawn-mycapn uds-netlayer))
|
||||||
|
(let ((rps-sref ($ mycapn 'register (rps host) 'testuds)))
|
||||||
|
(format #t "Connect to: ~a\n" (ocapn-id->string rps-sref)))))
|
||||||
|
|
||||||
|
|
||||||
|
(define (new-testuds-netlayer)
|
||||||
|
(spawn ^testuds-netlayer "/tmp/netlayers"))
|
||||||
|
|
||||||
|
(define (do-rps user-name)
|
||||||
|
(init (make <rps-host> #:user-name user-name)))
|
||||||
|
|
||||||
|
(define-class <rps-client> ()
|
||||||
|
(vat #:accessor vat #:init-keyword #:vat #:init-thunk spawn-vat)
|
||||||
|
(rps #:accessor rps)
|
||||||
|
(rps-addr #:accessor rps-addr #:init-keyword #:rps-addr)
|
||||||
|
(user-name #:accessor user-name #:init-keyword #:user-name))
|
||||||
|
|
||||||
|
(define-method (init (client <rps-client>))
|
||||||
|
(define rps-sref (string->ocapn-id (rps-addr client)))
|
||||||
|
(define uds-netlayer (new-testuds-netlayer))
|
||||||
|
(define mycapn (spawn-mycapn uds-netlayer))
|
||||||
|
(set! (rps client)
|
||||||
|
(<- mycapn 'enliven rps-sref))
|
||||||
|
(on (rps client) pk))
|
||||||
|
|
||||||
|
(define (join-rps user-name rps-addr)
|
||||||
|
(define client (make <rps-client> #:user-name user-name #:rps-addr rps-addr))
|
||||||
|
(with-vat (vat client)
|
||||||
|
(init client)
|
||||||
|
(format #t "Tor will take a bit...\n")
|
||||||
|
(let ((client-picker (spawn ^client-picker))
|
||||||
|
(rps (rps client)))
|
||||||
|
(on (<- rps 'register-opponent user-name client-picker ($ client-picker 'get-sealed-pick))
|
||||||
|
(lambda (_)
|
||||||
|
(format #t "Ok! we are registered.\n"))))))
|
||||||
|
|
||||||
|
|
||||||
|
(define rock-paper-scissors (list 'rock 'paper 'scissors))
|
||||||
|
|
||||||
|
(define (rps-winner a b)
|
||||||
|
(if (and (memq a rock-paper-scissors) (memq b rock-paper-scissors))
|
||||||
|
(match (list a b)
|
||||||
|
((x x) 'tie)
|
||||||
|
(('rock 'scissors) #t)
|
||||||
|
(('rock 'paper) #f)
|
||||||
|
(('scissors 'paper) #t)
|
||||||
|
(('paper 'scissors) #f)
|
||||||
|
((x y) (not (rps-winner y x))))
|
||||||
|
(error "Unexpected item in the shooting area" a b)))
|
|
@ -0,0 +1,33 @@
|
||||||
|
(use-modules
|
||||||
|
(guix packages)
|
||||||
|
((guix licenses) #:prefix license:)
|
||||||
|
(guix download)
|
||||||
|
(guix build-system gnu)
|
||||||
|
(gnu packages)
|
||||||
|
(gnu packages autotools)
|
||||||
|
(gnu packages guile)
|
||||||
|
(gnu packages guile-xyz)
|
||||||
|
(gnu packages pkg-config)
|
||||||
|
(gnu packages texinfo))
|
||||||
|
|
||||||
|
(package
|
||||||
|
(name "gib-gab-gob")
|
||||||
|
(version "0.1")
|
||||||
|
(source "./gib-gab-gob-0.1.tar.gz")
|
||||||
|
(build-system gnu-build-system)
|
||||||
|
(arguments `())
|
||||||
|
(native-inputs
|
||||||
|
`(("autoconf" ,autoconf)
|
||||||
|
("automake" ,automake)
|
||||||
|
("pkg-config" ,pkg-config)
|
||||||
|
("texinfo" ,texinfo)))
|
||||||
|
(inputs `(("guile" ,guile-3.0)))
|
||||||
|
(propagated-inputs
|
||||||
|
`(("guile-goblins" ,guile-goblins)))
|
||||||
|
(synopsis
|
||||||
|
"Rock Paper Scissors and Tic Tac Toe in Goblins!")
|
||||||
|
(description
|
||||||
|
"This project demonstrates both Rock Paper Scissors and Tic Tac Toe in Goblins!")
|
||||||
|
(home-page "https://solarpunk.moe")
|
||||||
|
(license license:gpl3+))
|
||||||
|
|
|
@ -0,0 +1,42 @@
|
||||||
|
(hall-description
|
||||||
|
(name "gib-gab-gob")
|
||||||
|
(prefix "")
|
||||||
|
(version "0.1")
|
||||||
|
(author "Vivi Langdon")
|
||||||
|
(copyright (2023))
|
||||||
|
(synopsis
|
||||||
|
"Rock Paper Scissors and Tic Tac Toe in Goblins!")
|
||||||
|
(description
|
||||||
|
"This project demonstrates both Rock Paper Scissors and Tic Tac Toe in Goblins!")
|
||||||
|
(home-page "https://solarpunk.moe")
|
||||||
|
(license gpl3+)
|
||||||
|
(dependencies
|
||||||
|
`(("guile-goblins" (goblins) ,guile-goblins)))
|
||||||
|
(skip ())
|
||||||
|
(files (libraries
|
||||||
|
((directory
|
||||||
|
"gib-gab-gob"
|
||||||
|
((scheme-file "rps") (scheme-file "actors")))))
|
||||||
|
(tests ((directory "tests" ())))
|
||||||
|
(programs ((directory "scripts" ())))
|
||||||
|
(documentation
|
||||||
|
((text-file "ChangeLog")
|
||||||
|
(text-file "AUTHORS")
|
||||||
|
(text-file "NEWS")
|
||||||
|
(directory "doc" ((texi-file "gib-gab-gob")))
|
||||||
|
(text-file "COPYING")
|
||||||
|
(text-file "HACKING")
|
||||||
|
(text-file "README")))
|
||||||
|
(infrastructure
|
||||||
|
((in-file "pre-inst-env")
|
||||||
|
(automake-file "Makefile")
|
||||||
|
(autoconf-file "configure")
|
||||||
|
(directory
|
||||||
|
"build-aux"
|
||||||
|
((tex-file "texinfo")
|
||||||
|
(scheme-file "test-driver")
|
||||||
|
(text-file "missing")
|
||||||
|
(text-file "install-sh")
|
||||||
|
(text-file "mdate-sh")))
|
||||||
|
(scheme-file "hall")
|
||||||
|
(text-file ".gitignore")))))
|
|
@ -0,0 +1,13 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
abs_top_srcdir="`cd "@abs_top_srcdir@" > /dev/null; pwd`"
|
||||||
|
abs_top_builddir="`cd "@abs_top_builddir@" > /dev/null; pwd`"
|
||||||
|
|
||||||
|
GUILE_LOAD_COMPILED_PATH="$abs_top_builddir${GUILE_LOAD_COMPILED_PATH:+:}$GUILE_LOAD_COMPILED_PATH"
|
||||||
|
GUILE_LOAD_PATH="$abs_top_builddir:$abs_top_srcdir${GUILE_LOAD_PATH:+:}:$GUILE_LOAD_PATH"
|
||||||
|
export GUILE_LOAD_COMPILED_PATH GUILE_LOAD_PATH
|
||||||
|
|
||||||
|
PATH="$abs_top_builddir/scripts:$PATH"
|
||||||
|
export PATH
|
||||||
|
|
||||||
|
exec "$@"
|
Loading…
Reference in New Issue