initial
This commit is contained in:
40
README.md
Normal file
40
README.md
Normal 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 it’s better to not call
|
||||
it at all if it’s avoidable. Inlining your C in Carp does not magically make it
|
||||
safe, naturally.
|
||||
|
||||
<hr/>
|
||||
|
||||
Have fun!
|
13
examples/set-bits.carp
Normal file
13
examples/set-bits.carp
Normal 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
11
examples/simple.carp
Normal 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
9
main.carp
Normal 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))))
|
Reference in New Issue
Block a user