1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
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);
```
|