#!/usr/bin/env sh
exec guile -L $(dirname $(dirname $(realpath "$0"))) --language=wisp -e '(@@ (examples multithreaded-magic) main)' -s "$0" "$@"
; !#
define-module : examples multithreaded-magic
; Mathematical magic: Always get one.
;
; Via http://www.liv.ac.uk/HPC/HTMLF90Course/HTMLF90CourseQuestionsnode18.html
; (actually for learning fortran)
;
; this is the wisp scheme version which I want to compare with the fortran version.
; Call as PATH=~/guile/meta:$PATH ./examples/multithreaded-magic.w
use-modules
ice-9 format
ice-9 futures
ice-9 threads
define : magic-threaded mutex futures integer
; this can cause unordered output. It’s fun anyway :
let
:
futures
cons : future : with-mutex mutex : format #t "~30r\n" integer
. futures
if : not : = integer 1
if : even? integer
magic-threaded mutex futures {integer / 2}
magic-threaded mutex futures
truncate : + 1 {integer / 3}
for-each touch futures
define : magic integer
magic-threaded
make-mutex
list
. integer
define : magic-simple integer
format #t "~30r\n" integer
if : not : = integer 1
if : even? integer
magic-simple : / integer 2
magic-simple : truncate : + 1 : / integer 3
define : main args
display ";;; multithreaded magic ;;;\n"
magic 456189456156456196152615
display ";;; simple magic ;;;\n"
magic-simple 456189456156456196152615