;;; nsmc --- n-sphere Monte Carlo method ;;; Copyright © 2021 Arun I ;;; Copyright © 2021 Murugesan Venkatapathi ;;; ;;; This file is part of nsmc. ;;; ;;; nsmc 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. ;;; ;;; nsmc 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 nsmc. If not, see . (sc-define-syntax (when condition body ...) (cond (condition body ...))) (sc-define-syntax (unless condition body ...) (when (not condition) body ...)) (sc-define-syntax (incr var) (set+ var 1)) (sc-define-syntax (for-i index limit body ...) (for ((define index int 0) (< index limit) (set+ index 1)) body ...)) (sc-define-syntax (for-i-step index start max step body ...) (for ((define index int start) (<= index max) (set+ index step)) body ...)) (sc-define-syntax (with-alloc var type allocate free body ...) (let* ((var type allocate)) body ... (free var))) (sc-define-syntax (with-vector var size body ...) (with-alloc var gsl-vector* (gsl-vector-alloc size) gsl-vector-free body ...)) (sc-define-syntax (with-matrix var m n body ...) (with-alloc var gsl-matrix* (gsl-matrix-alloc m n) gsl-matrix-free body ...)) (sc-define-syntax (with-square-matrix var n body ...) (with-alloc var gsl-matrix* (gsl-matrix-alloc n n) gsl-matrix-free body ...)) (sc-define-syntax (with-rng var body ...) (with-alloc var gsl-rng* (gsl-rng-alloc gsl-rng-default) gsl-rng-free body ...)) (sc-define-syntax (with-rstats var body ...) (with-alloc var gsl-rstat-workspace* (gsl-rstat-alloc) gsl-rstat-free body ...)) (sc-define-syntax (with-rstats* var n body ...) (begin (declare var (array gsl-rstat-workspace* 3)) (for-i i n (array-set var i (gsl-rstat-alloc))) body ... (for-i i n (gsl-rstat-free (array-get var i))))) (sc-define-syntax (with-file fp filename mode body ...) (with-alloc fp FILE* (begin (fopen filename mode) (unless fp (perror filename) (exit EXIT_FAILURE))) fclose body ...)) (sc-define-syntax* (with-data-file fp filename mode body ...) (let* ((data-file (string-append "data/" filename))) `(with-file fp ,data-file ,mode ,@(if (string=? mode "w") `((fprintf stderr "Writing to %s...\n" ,data-file)) '()) ,@body)))