diff options
Diffstat (limited to 'prescheme-nim-local/notes.md')
-rw-r--r-- | prescheme-nim-local/notes.md | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/prescheme-nim-local/notes.md b/prescheme-nim-local/notes.md new file mode 100644 index 0000000..62b64e2 --- /dev/null +++ b/prescheme-nim-local/notes.md @@ -0,0 +1,94 @@ +# 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); +``` |