initial
This commit is contained in:
@@ -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!
|
||||||
@@ -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)))
|
||||||
@@ -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))))
|
||||||
Reference in New Issue
Block a user