Thinks that tripped me up
Underscores
Using _ for Lisp names.
typedef struct
typedef struct
{
size_t size;
size_t stride;
double * data;
gsl_block * block;
int owner;
} gsl_vector;
prescheme generated this syntax for
(define-wrapper-type gsl-vector)
struct gsl_vector {
};
struct gsl_vector *vector_3X;
resulting in
expected 'gsl_vector *' but argument is of type 'struct gsl_vector *'
82 | void gsl_vector_free (gsl_vector * v);
how to map one to the other? If you take out the struct it works. So, somehow, I need to create an opaque data structure.
(define (gsl-create-vector size) ; gsl_vector_alloc (3);
((external "gsl_vector_alloc" (=> (integer) (^ unit)))
size))
(define (gsl-destroy-vector vector)
((external "gsl_vector_free" (=> (address) unit))
vector))
as unit translate to void that works - but there is no type safety. Well, at least not at the prescheme level.
ps-compiler/prescheme/type.scm make-pointer-type
For now I solved it by having sed edit out the 'struct' from the C code.
Floating point
Initializing with 1.0 (leading zero) works. But 1.1 does not. The c-code becomes an empty space.
openblas.c:36:108: error: expected expression before ')' token
36 | else {gsl_vector_set(vector_2X, 0, 0.0);gsl_vector_set(vector_2X, 1, 1.0);gsl_vector_set(vector_2X, 2, );gsl_vector_set(vector_2X, 3, 4.0);gsl_vector_set(vector_2X, 4, 5.0);
This was fixed by Andrew Whatson for me!
Loading a module
Requires restarting prescheme? Note that file prescheme/memory.scm is loaded with ps-memory.
(define-structure openblas (export main)
(open prescheme)
;; (open ps-receive)
(open ps-memory)
;; (open prescheme interface)
(open ps-utils)
(open ps-string)
(open ps-vector)
;; (open prescheme interfaces)
(files openblas))
SIMDE
Let's try to multiply a vector with a scalar.
const __m128 scalar = _mm_set1_ps(s);
__m128 result = _mm_mul_ps(vector, scalar);