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