#!/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