This commit is contained in:
2020-02-17 11:22:31 +01:00
commit f03f085966
4 changed files with 73 additions and 0 deletions

40
README.md Normal file
View File

@@ -0,0 +1,40 @@
# inline-c
is a simple module for defining C code inside Carp code.
## Installation
```clojure
(load "https://veitheller.de/git/carpentry/inline-c@0.0.1")
```
## Usage
This module only provides one function, `inline-c` (it is a macro, actually
:shrug:). This function enables you to write C code inline as a string, to
express those things that are just kind of awkward in Carp (like complex
bit-twiddling) without having to include a helper every time.
```clojure
(load "https://veitheller.de/git/carpentry/inline-c@0.0.1")
(inline-c "int count_set_bits(int n) {
int count = 0;
while (n) {
count += n & 1;
n >>= 1;
}
return count;
}")
(register count-set-bits (Fn [Int] Int) "count_set_bits")
(defn main [] (println* &(count-set-bits 462)))
```
The function is safe to be called multiple times, but its better to not call
it at all if its avoidable. Inlining your C in Carp does not magically make it
safe, naturally.
<hr/>
Have fun!

13
examples/set-bits.carp Normal file
View File

@@ -0,0 +1,13 @@
(load "main.carp")
(inline-c "int count_set_bits(int n) {
int count = 0;
while (n) {
count += n & 1;
n >>= 1;
}
return count;
}")
(register count-set-bits (Fn [Int] Int) "count_set_bits")
(defn main [] (println* &(count-set-bits 462)))

11
examples/simple.carp Normal file
View File

@@ -0,0 +1,11 @@
(load "main.carp")
(inline-c "long x() { return (1<<30)+12; }")
(register x (Fn [] Long))
(inline-c "#include <stdio.h>
long y() { puts(\"inside c!\"); return 42; }")
(register y (Fn [] Long))
(defn main [] (println* (+ (x) (y))))

9
main.carp Normal file
View File

@@ -0,0 +1,9 @@
(defdynamic *c-counter* 0)
(defndynamic inline-c [s]
(let [f (String.join [(Project.get-config "output-directory")
"carp_inline_c_generated" (str *c-counter*) ".h"])]
(do
(write-file f s)
(defdynamic *c-counter* (inc *c-counter*))
(system-include f))))