aboutsummaryrefslogtreecommitdiff
path: root/prescheme-nim-local/notes.md
blob: 62b64e22c1f08fdfad1abdfbb1d5b7eb7b0f8699 (about) (plain)
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);
```