# Thinks that tripped me up # Underscores Using _ for Lisp names. # typedef struct ```C typedef struct { size_t size; size_t stride; double * data; gsl_block * block; int owner; } gsl_vector; ``` prescheme generated this syntax for ```lisp (define-wrapper-type gsl-vector) ``` ```C 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); ```