mirror of
https://github.com/carp-lang/Carp.git
synced 2024-11-04 01:25:04 +03:00
chore: Move some examples to test/produces-output (#989)
* chore: Moved examples that work more as tests to folder 'test/produces-output' * fix: Corrections to the release script * fix: Correct filename on Windows * fix: Move more files around * fix: Remove check-malloc example * fix: Apparently unicode example does not work * chore: Move nested_lambdas.carp back to examples * chore: Remove .DS_Store files * fix: Bring back unicode test * test: Make sure benchmark compile (had to remove mandelbrot and n-bodies) * fix: Replacement implementation of clock_gettime on Windows * chore: Trigger CI * fix: Define CLOCK_REALTIME Co-authored-by: Erik Svedang <erik@Eriks-iMac.local>
This commit is contained in:
parent
8e9f7bfd90
commit
a873099640
@ -1,3 +1,70 @@
|
|||||||
|
#if defined _WIN32
|
||||||
|
|
||||||
|
// The function 'clock_gettime' is not available on Windows.
|
||||||
|
// Our replacement implementation was taken from Stack overflow:
|
||||||
|
// https://stackoverflow.com/questions/5404277/porting-clock-gettime-to-windows
|
||||||
|
|
||||||
|
#include <windows.h>
|
||||||
|
|
||||||
|
#define CLOCK_REALTIME 0
|
||||||
|
|
||||||
|
LARGE_INTEGER getFILETIMEoffset() {
|
||||||
|
SYSTEMTIME s;
|
||||||
|
FILETIME f;
|
||||||
|
LARGE_INTEGER t;
|
||||||
|
|
||||||
|
s.wYear = 1970;
|
||||||
|
s.wMonth = 1;
|
||||||
|
s.wDay = 1;
|
||||||
|
s.wHour = 0;
|
||||||
|
s.wMinute = 0;
|
||||||
|
s.wSecond = 0;
|
||||||
|
s.wMilliseconds = 0;
|
||||||
|
SystemTimeToFileTime(&s, &f);
|
||||||
|
t.QuadPart = f.dwHighDateTime;
|
||||||
|
t.QuadPart <<= 32;
|
||||||
|
t.QuadPart |= f.dwLowDateTime;
|
||||||
|
return (t);
|
||||||
|
}
|
||||||
|
|
||||||
|
int clock_gettime(int X, struct timeval *tv) {
|
||||||
|
LARGE_INTEGER t;
|
||||||
|
FILETIME f;
|
||||||
|
double microseconds;
|
||||||
|
static LARGE_INTEGER offset;
|
||||||
|
static double frequencyToMicroseconds;
|
||||||
|
static int initialized = 0;
|
||||||
|
static BOOL usePerformanceCounter = 0;
|
||||||
|
|
||||||
|
if (!initialized) {
|
||||||
|
LARGE_INTEGER performanceFrequency;
|
||||||
|
initialized = 1;
|
||||||
|
usePerformanceCounter = QueryPerformanceFrequency(&performanceFrequency);
|
||||||
|
if (usePerformanceCounter) {
|
||||||
|
QueryPerformanceCounter(&offset);
|
||||||
|
frequencyToMicroseconds = (double)performanceFrequency.QuadPart / 1000000.;
|
||||||
|
} else {
|
||||||
|
offset = getFILETIMEoffset();
|
||||||
|
frequencyToMicroseconds = 10.;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (usePerformanceCounter) QueryPerformanceCounter(&t);
|
||||||
|
else {
|
||||||
|
GetSystemTimeAsFileTime(&f);
|
||||||
|
t.QuadPart = f.dwHighDateTime;
|
||||||
|
t.QuadPart <<= 32;
|
||||||
|
t.QuadPart |= f.dwLowDateTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
t.QuadPart -= offset.QuadPart;
|
||||||
|
microseconds = (double)t.QuadPart / frequencyToMicroseconds;
|
||||||
|
t.QuadPart = microseconds;
|
||||||
|
tv->tv_sec = t.QuadPart / 1000000;
|
||||||
|
tv->tv_usec = t.QuadPart % 1000000;
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
double get_time_elapsed() {
|
double get_time_elapsed() {
|
||||||
struct timespec tv;
|
struct timespec tv;
|
||||||
clock_gettime(CLOCK_REALTIME, &tv);
|
clock_gettime(CLOCK_REALTIME, &tv);
|
||||||
|
@ -1,25 +0,0 @@
|
|||||||
(use Array)
|
|
||||||
(use String)
|
|
||||||
|
|
||||||
(defn ex1 []
|
|
||||||
(let [a (Array.allocate 2)
|
|
||||||
b (Array.aset a 0 (fn [] @"Hello"))
|
|
||||||
c (Array.aset b 1 (fn [] @"World"))
|
|
||||||
]
|
|
||||||
(do
|
|
||||||
(println* (@(Array.unsafe-nth &c 0)))
|
|
||||||
(println* (@(Array.unsafe-nth &c 1))))))
|
|
||||||
|
|
||||||
(defn ex2 []
|
|
||||||
(let [a (Array.allocate 2)
|
|
||||||
b (Array.aset a 0 (fn [x] (String.append "Hello" x)))
|
|
||||||
c (Array.aset b 1 (fn [s] (String.append s "World")))
|
|
||||||
]
|
|
||||||
(do
|
|
||||||
(println* (@(Array.unsafe-nth &c 0) " World"))
|
|
||||||
(println* (@(Array.unsafe-nth &c 1) "Hello ")))))
|
|
||||||
|
|
||||||
(defn main []
|
|
||||||
(do
|
|
||||||
(ex1)
|
|
||||||
(ex2)))
|
|
@ -1,67 +0,0 @@
|
|||||||
;;; Taken from
|
|
||||||
;;; http://benchmarksgame.alioth.debian.org/u64q/program.php?test=mandelbrot&lang=gcc&id=2
|
|
||||||
|
|
||||||
(add-cflag "-Wall -pipe -O3 -fomit-frame-pointer -march=native")
|
|
||||||
|
|
||||||
(use Double)
|
|
||||||
(use Int)
|
|
||||||
(use String)
|
|
||||||
(use IO)
|
|
||||||
|
|
||||||
(def w 16000.0)
|
|
||||||
(def h 16000.0)
|
|
||||||
|
|
||||||
(system-include "stdio.h")
|
|
||||||
(register-type FILE)
|
|
||||||
(register stdout FILE)
|
|
||||||
(register putc (Fn [Int FILE] ()))
|
|
||||||
|
|
||||||
(defn main []
|
|
||||||
(do
|
|
||||||
(print &(str* @"P4\n" (str w) @" " (str h) @"\n"))
|
|
||||||
(let [iter 50
|
|
||||||
limit 2.0
|
|
||||||
byte_acc 0
|
|
||||||
bit_num 0]
|
|
||||||
(for [y 0 (to-int h)]
|
|
||||||
(for [x 0 (to-int w)]
|
|
||||||
(let [Zr 0.0
|
|
||||||
Zi 0.0
|
|
||||||
Tr 0.0
|
|
||||||
Ti 0.0
|
|
||||||
Cr (- (/ (* 2.0 (from-int x)) w) 1.5)
|
|
||||||
Ci (- (/ (* 2.0 (from-int y)) w) 1.0)]
|
|
||||||
(do
|
|
||||||
(let [i 0]
|
|
||||||
(while (and (< i iter)
|
|
||||||
(<= (+ Tr Ti) (* limit limit)))
|
|
||||||
(do
|
|
||||||
(set! Zi (+ (* 2.0 (* Zr Zi)) Ci))
|
|
||||||
(set! Zr (+ (- Tr Ti) Cr))
|
|
||||||
(set! Tr (* Zr Zr))
|
|
||||||
(set! Ti (* Zi Zi))
|
|
||||||
(set! i (inc i)))))
|
|
||||||
|
|
||||||
(set! byte_acc (* 2 byte_acc))
|
|
||||||
|
|
||||||
(when (<= (+ Tr Ti) (* limit limit))
|
|
||||||
(set! byte_acc (bit-or byte_acc 1)))
|
|
||||||
|
|
||||||
(set! bit_num (inc bit_num))
|
|
||||||
|
|
||||||
(if (= bit_num 8)
|
|
||||||
(do
|
|
||||||
(putc byte_acc stdout)
|
|
||||||
(set! byte_acc 0)
|
|
||||||
(set! bit_num 0))
|
|
||||||
(if (= x (- (to-int w) 1))
|
|
||||||
(do
|
|
||||||
(set! byte_acc
|
|
||||||
(bit-shift-left byte_acc (- 8 (mod (to-int w) 8))))
|
|
||||||
(putc byte_acc stdout)
|
|
||||||
(set! byte_acc 0)
|
|
||||||
(set! bit_num 0))
|
|
||||||
())))))))))
|
|
||||||
|
|
||||||
|
|
||||||
;;; (build)
|
|
@ -1,159 +0,0 @@
|
|||||||
;;; Taken from
|
|
||||||
;;; http://benchmarksgame.alioth.debian.org/u64q/program.php?test=nbody&lang=gcc&id=1
|
|
||||||
|
|
||||||
(add-cflag "-Wall -pipe -O3 -fomit-frame-pointer -march=native -mfpmath=sse -msse3")
|
|
||||||
|
|
||||||
(use IO)
|
|
||||||
(use Double)
|
|
||||||
(use Array)
|
|
||||||
(use Int)
|
|
||||||
|
|
||||||
;;; pow(double, double) is 5 times slower for (pow x 3)
|
|
||||||
; int Int_pow(int x, int y) {
|
|
||||||
; int r = 1;
|
|
||||||
; while (y) {
|
|
||||||
; if (y & 1)
|
|
||||||
; r *= x;
|
|
||||||
; y >>= 1;
|
|
||||||
; x *= x;
|
|
||||||
; }
|
|
||||||
; return r;
|
|
||||||
; }
|
|
||||||
(defn ipow [x y]
|
|
||||||
(let-do [r 1.0]
|
|
||||||
(while (/= y 0)
|
|
||||||
(do
|
|
||||||
(when (/= (bit-and y 1) 0)
|
|
||||||
(set! r (* r x)))
|
|
||||||
(set! y (/ y 2))
|
|
||||||
(set! x (* x x))))
|
|
||||||
r))
|
|
||||||
|
|
||||||
(def n 50000000)
|
|
||||||
|
|
||||||
(defn solar_mass [] (* (* 4.0 pi) pi)) ;; I cannot #DEFINE, so solar_mass cannot be a `def`
|
|
||||||
(def days_per_year 365.24)
|
|
||||||
|
|
||||||
(deftype Planet
|
|
||||||
[ x Double y Double z Double
|
|
||||||
vx Double vy Double vz Double
|
|
||||||
mass Double ])
|
|
||||||
|
|
||||||
; for eg. 1.03e-03
|
|
||||||
(defn e [d exp]
|
|
||||||
(* d (pow 10.0 (from-int exp))))
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
; currying would make this a single line
|
|
||||||
; + lambdas would make this unneeded
|
|
||||||
(defn reduce-px [t b] (+ @t (* (Planet.vx b) (Planet.mass b))))
|
|
||||||
(defn reduce-py [t b] (+ @t (* (Planet.vy b) (Planet.mass b))))
|
|
||||||
(defn reduce-pz [t b] (+ @t (* (Planet.vz b) (Planet.mass b))))
|
|
||||||
|
|
||||||
(defn offset_momentum [bodies]
|
|
||||||
(let [b (unsafe-nth bodies 0)
|
|
||||||
px (reduce reduce-px 0.0 bodies)
|
|
||||||
py (reduce reduce-py 0.0 bodies)
|
|
||||||
pz (reduce reduce-pz 0.0 bodies)]
|
|
||||||
(do
|
|
||||||
(Planet.set-vx! b (/ (neg px) (solar_mass)))
|
|
||||||
(Planet.set-vy! b (/ (neg py) (solar_mass)))
|
|
||||||
(Planet.set-vz! b (/ (neg pz) (solar_mass))))))
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
(defn energy [bodies]
|
|
||||||
(let-do [e 0.0]
|
|
||||||
(for [i 0 (length bodies)]
|
|
||||||
(let-do [b (unsafe-nth bodies i)]
|
|
||||||
(set! e (+ e (* 0.5 (* (Planet.mass b)
|
|
||||||
(+ (ipow (Planet.vx b) 2)
|
|
||||||
(+ (ipow (Planet.vy b) 2)
|
|
||||||
(ipow (Planet.vz b) 2)))))))
|
|
||||||
|
|
||||||
(for [j (+ i 1) (length bodies)]
|
|
||||||
(let [b2 (unsafe-nth bodies j)
|
|
||||||
dx (- (Planet.x b) (Planet.x b2))
|
|
||||||
dy (- (Planet.y b) (Planet.y b2))
|
|
||||||
dz (- (Planet.z b) (Planet.z b2))
|
|
||||||
dist (sqrt (+ (ipow dx 2) (+ (ipow dy 2) (ipow dz 2))))]
|
|
||||||
(set! e (- e (/ (* (Planet.mass b) (Planet.mass b2)) dist)))))))
|
|
||||||
e))
|
|
||||||
|
|
||||||
|
|
||||||
(defn update-planet [i bodies dt]
|
|
||||||
(let [b (unsafe-nth bodies i)]
|
|
||||||
(do
|
|
||||||
(Planet.set-x! b (+ (Planet.x b) (* dt (Planet.vx b))))
|
|
||||||
(Planet.set-y! b (+ (Planet.y b) (* dt (Planet.vy b))))
|
|
||||||
(Planet.set-z! b (+ (Planet.z b) (* dt (Planet.vz b)))))))
|
|
||||||
|
|
||||||
(defn advance [bodies dt]
|
|
||||||
(do
|
|
||||||
(for [i 0 (length bodies)]
|
|
||||||
(let [b (unsafe-nth bodies i)]
|
|
||||||
(for [j (+ i 1) (length bodies)]
|
|
||||||
(let [b2 (unsafe-nth bodies j)
|
|
||||||
dx (- (Planet.x b) (Planet.x b2))
|
|
||||||
dy (- (Planet.y b) (Planet.y b2))
|
|
||||||
dz (- (Planet.z b) (Planet.z b2))
|
|
||||||
dist (sqrt (+ (ipow dx 2) (+ (ipow dy 2) (ipow dz 2))))
|
|
||||||
mag (/ dt (ipow dist 3))]
|
|
||||||
(do
|
|
||||||
(Planet.set-vx! b (- (Planet.vx b) (* dx (* (Planet.mass b2) mag))))
|
|
||||||
(Planet.set-vy! b (- (Planet.vy b) (* dy (* (Planet.mass b2) mag))))
|
|
||||||
(Planet.set-vz! b (- (Planet.vz b) (* dz (* (Planet.mass b2) mag))))
|
|
||||||
|
|
||||||
(Planet.set-vx! b2 (+ (Planet.vx b2) (* dx (* (Planet.mass b) mag))))
|
|
||||||
(Planet.set-vy! b2 (+ (Planet.vy b2) (* dy (* (Planet.mass b) mag))))
|
|
||||||
(Planet.set-vz! b2 (+ (Planet.vz b2) (* dz (* (Planet.mass b) mag)))))))))
|
|
||||||
|
|
||||||
(for [i 0 (length bodies)]
|
|
||||||
(update-planet i bodies dt))))
|
|
||||||
|
|
||||||
; defining bodies outside main (`def`) results in c compile error:
|
|
||||||
; - solar mass is a function
|
|
||||||
; - i cannot do eg. 1.01e-03
|
|
||||||
(defn main []
|
|
||||||
(let-do [bodies [
|
|
||||||
(Planet.init 0.0 0.0 0.0 0.0 0.0 0.0 (solar_mass))
|
|
||||||
(Planet.init ; jupiter
|
|
||||||
(e 4.84143144246472090 0)
|
|
||||||
(e -1.16032004402742839 0)
|
|
||||||
(e -1.03622044471123109 -1)
|
|
||||||
(* (e 1.66007664274403694 -3) days_per_year)
|
|
||||||
(* (e 7.69901118419740425 -3) days_per_year)
|
|
||||||
(* (e -6.90460016972063023 -5) days_per_year)
|
|
||||||
(* (e 9.54791938424326609 -4) (solar_mass)))
|
|
||||||
(Planet.init ; saturn
|
|
||||||
(e 8.34336671824457987 0)
|
|
||||||
(e 4.12479856412430479 0)
|
|
||||||
(e -4.03523417114321381 -1)
|
|
||||||
(* (e -2.76742510726862411 -3) days_per_year)
|
|
||||||
(* (e 4.99852801234917238 -3) days_per_year)
|
|
||||||
(* (e 2.30417297573763929 -5) days_per_year)
|
|
||||||
(* (e 2.85885980666130812 -4) (solar_mass)))
|
|
||||||
(Planet.init ; uranus
|
|
||||||
(e 1.28943695621391310 1)
|
|
||||||
(e -1.51111514016986312 1)
|
|
||||||
(e -2.23307578892655734 -1)
|
|
||||||
(* (e 2.96460137564761618 -3) days_per_year)
|
|
||||||
(* (e 2.37847173959480950 -3) days_per_year)
|
|
||||||
(* (e -2.96589568540237556 -5) days_per_year)
|
|
||||||
(* (e 4.36624404335156298 -5) (solar_mass)))
|
|
||||||
(Planet.init ; neptune
|
|
||||||
(e 1.53796971148509165 1)
|
|
||||||
(e -2.59193146099879641 1)
|
|
||||||
(e 1.79258772950371181 -1)
|
|
||||||
(* (e 2.68067772490389322 -3) days_per_year)
|
|
||||||
(* (e 1.62824170038242295 -3) days_per_year)
|
|
||||||
(* (e -9.51592254519715870 -5) days_per_year)
|
|
||||||
(* (e 5.15138902046611451 -5) (solar_mass)))
|
|
||||||
]]
|
|
||||||
(offset_momentum &bodies)
|
|
||||||
(println &(str (energy &bodies))) ; printf %.9f
|
|
||||||
(for [i 0 n]
|
|
||||||
(do
|
|
||||||
(advance &bodies 0.01)))
|
|
||||||
(println &(str (energy &bodies))))) ;
|
|
@ -1,4 +0,0 @@
|
|||||||
(Debug.check-allocations)
|
|
||||||
|
|
||||||
(defn main []
|
|
||||||
(println* &(Array.repeat 10000000 &Int.zero)))
|
|
@ -1,67 +0,0 @@
|
|||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
// (defn main []
|
|
||||||
// (let-do [x 123
|
|
||||||
// f (fn [y] (+ x y))
|
|
||||||
// g square]
|
|
||||||
// (f 210)
|
|
||||||
// (g 3))
|
|
||||||
|
|
||||||
// Environment for this particular lambda
|
|
||||||
typedef struct Env_main_0 {
|
|
||||||
int x;
|
|
||||||
} Env_main_0;
|
|
||||||
|
|
||||||
// Deleter
|
|
||||||
void delete_Env_main_0(Env_main_0 *env) {
|
|
||||||
// no managed members to free in this case
|
|
||||||
free(env);
|
|
||||||
printf("Deleted Env_main_0\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
typedef struct Closure {
|
|
||||||
void *callback;
|
|
||||||
void *env;
|
|
||||||
void (*delete)(void*);
|
|
||||||
} Closure;
|
|
||||||
|
|
||||||
typedef int (*Fn_CallClosure__Int_Int)(void*, int);
|
|
||||||
typedef int (*Fn_Int_Int)(int);
|
|
||||||
|
|
||||||
// The body of the lambda, but lifted to its own function. Takes the environment as a first argument.
|
|
||||||
int lifted_lambda_main_0(Env_main_0 *env, int y) {
|
|
||||||
return env->x + y; // simplified for readability
|
|
||||||
}
|
|
||||||
|
|
||||||
int square(int x) {
|
|
||||||
return x * x;
|
|
||||||
}
|
|
||||||
|
|
||||||
int main() {
|
|
||||||
// let x
|
|
||||||
int x = 123;
|
|
||||||
// let f
|
|
||||||
Env_main_0 *env_0 = malloc(sizeof(Env_main_0));
|
|
||||||
env_0->x = x;
|
|
||||||
Closure f = {
|
|
||||||
.callback = (void*)lifted_lambda_main_0,
|
|
||||||
.env = env_0,
|
|
||||||
.delete = (void*)delete_Env_main_0
|
|
||||||
};
|
|
||||||
//let g
|
|
||||||
Closure g = {
|
|
||||||
.callback = square,
|
|
||||||
.env = NULL,
|
|
||||||
.delete = NULL
|
|
||||||
};
|
|
||||||
// call f
|
|
||||||
int _1 = f.env ? ((Fn_CallClosure__Int_Int)f.callback)(f.env, 210) : ((Fn_Int_Int)f.callback)(210);
|
|
||||||
// delete f
|
|
||||||
if(f.delete) { f.delete(f.env); }
|
|
||||||
// call g
|
|
||||||
int _2 = g.env ? ((Fn_CallClosure__Int_Int)g.callback)(f.env, 3) : ((Fn_Int_Int)g.callback)(3);
|
|
||||||
// delete g
|
|
||||||
if(g.delete) { f.delete(f.env); }
|
|
||||||
printf("_1 = %d\n_2 = %d\n", _1, _2);
|
|
||||||
}
|
|
@ -1,29 +0,0 @@
|
|||||||
;; Initial type
|
|
||||||
(deftype A [])
|
|
||||||
|
|
||||||
;; Initial function
|
|
||||||
(definterface f (λ [x] String))
|
|
||||||
(defmodule A
|
|
||||||
(defn f [x]
|
|
||||||
(str* "It's an A: " &(A.str x))))
|
|
||||||
|
|
||||||
;; Add a new function
|
|
||||||
(definterface g (λ [x] String))
|
|
||||||
(defmodule A
|
|
||||||
(defn g [x]
|
|
||||||
(str* "It's also an A: " &(A.str x))))
|
|
||||||
|
|
||||||
;; Add a new type
|
|
||||||
(deftype B [])
|
|
||||||
(defmodule B
|
|
||||||
(defn f [x]
|
|
||||||
(str* "It's a B: " &(B.str x)))
|
|
||||||
(defn g [x]
|
|
||||||
(str* "It's also a B: " &(B.str x))))
|
|
||||||
|
|
||||||
;; Run
|
|
||||||
(defn-do main []
|
|
||||||
(println* &(f &(A.init)))
|
|
||||||
(println* &(g &(A.init)))
|
|
||||||
(println* &(f &(B.init)))
|
|
||||||
(println* &(g &(B.init))))
|
|
@ -1,4 +1,4 @@
|
|||||||
(relative-include "banana.h")
|
(relative-include "headers/banana.h")
|
||||||
(Project.no-echo)
|
(Project.no-echo)
|
||||||
|
|
||||||
(register-type Apple)
|
(register-type Apple)
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
(load "SDL.carp")
|
(load "SDL.carp")
|
||||||
(load "SDL_ttf.carp")
|
(load "SDL_ttf.carp")
|
||||||
|
|
||||||
;;(Debug.sanitize-addresses)
|
|
||||||
(Project.config "title" "Fonts")
|
(Project.config "title" "Fonts")
|
||||||
|
|
||||||
(def font (the (Ptr TTF_Font) NULL))
|
(def font (the (Ptr TTF_Font) NULL))
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
(use GLFW)
|
(use GLFW)
|
||||||
|
|
||||||
(load "OpenGL.carp")
|
(load "OpenGL.carp")
|
||||||
|
(Project.config "cflag" "-DGL_SILENCE_DEPRECATION")
|
||||||
|
|
||||||
(defn t []
|
(defn t []
|
||||||
(Double.to-float (get-time)))
|
(Double.to-float (get-time)))
|
||||||
|
@ -1,178 +0,0 @@
|
|||||||
(Debug.sanitize-addresses)
|
|
||||||
(Project.config "print-ast" true)
|
|
||||||
|
|
||||||
;; Preventing the usage of a reference to a deleted object
|
|
||||||
;; (defn f []
|
|
||||||
;; (let-do [x @"DATA"
|
|
||||||
;; r &x]
|
|
||||||
;; (delete x)
|
|
||||||
;; (IO.println r)))
|
|
||||||
|
|
||||||
;; Same as above, but deleting the argument
|
|
||||||
;; (defn g [x]
|
|
||||||
;; (let-do [r &x]
|
|
||||||
;; (delete (the String x))
|
|
||||||
;; (IO.println r)))
|
|
||||||
|
|
||||||
;; A function accepting two refs and returning one of them
|
|
||||||
;; (defn two-refs [x a b]
|
|
||||||
;; (if x
|
|
||||||
;; (the (Ref t q) a)
|
|
||||||
;; (the (Ref t w) b)))
|
|
||||||
|
|
||||||
;; Lambdas
|
|
||||||
;; (defn l []
|
|
||||||
;; (let [x @"DATA"
|
|
||||||
;; r &x
|
|
||||||
;; f (fn [] (IO.println r))]
|
|
||||||
;; (do
|
|
||||||
;; (String.delete x)
|
|
||||||
;; (f))))
|
|
||||||
|
|
||||||
;; (defn from-ptr [a]
|
|
||||||
;; (if (null? a)
|
|
||||||
;; (Maybe.Nothing)
|
|
||||||
;; (Maybe.Just @(Pointer.to-ref a))))
|
|
||||||
|
|
||||||
;; (defn pair-eq [p1 p2]
|
|
||||||
;; (and (= (Pair.a p1) (Pair.a p2))
|
|
||||||
;; (= (Pair.b p1) (Pair.b p2)))
|
|
||||||
;; )
|
|
||||||
|
|
||||||
;; (defn map-put []
|
|
||||||
;; (fn [b]
|
|
||||||
;; (let [n &b]
|
|
||||||
;; ())))
|
|
||||||
|
|
||||||
|
|
||||||
;; (defn f [x y]
|
|
||||||
;; (let [s @"hej"
|
|
||||||
;; z 123]
|
|
||||||
;; (Int.+ x y)))
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
;; (defn f []
|
|
||||||
;; &100) ;; TODO: Number literals should create prim var deleter too!
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
;; use-ref-in-lambda-after-free
|
|
||||||
;; (defn boo []
|
|
||||||
;; (let-do [data @"DATA"
|
|
||||||
;; r &data
|
|
||||||
;; f (fn []
|
|
||||||
;; (IO.println (id r)))]
|
|
||||||
;; ;;(String.delete data)
|
|
||||||
;; (f)))
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
;; (defn foo []
|
|
||||||
;; (let-do [data [10 20 30]
|
|
||||||
;; r &data
|
|
||||||
;; f (fn [] (Array.nth r 1))]
|
|
||||||
;; ;;(Array.delete data)
|
|
||||||
;; (println* (f))))
|
|
||||||
|
|
||||||
;; (defn lam []
|
|
||||||
;; (let [stuff [100 200 300]
|
|
||||||
;; ;;r &stuff
|
|
||||||
;; f (fn []
|
|
||||||
;; (println* (id &stuff)))]
|
|
||||||
;; (f)))
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
;; Problematic order of arguments, the variable 'b' will depend on 'snake', which is consumed first in the call to Snake.set-body
|
|
||||||
;; (use Array)
|
|
||||||
;; (deftype Snake [body (Array Int)])
|
|
||||||
|
|
||||||
;; (defn grow [snake]
|
|
||||||
;; (let [b (Snake.body &snake)]
|
|
||||||
;; (Snake.set-body snake (push-back @b 0))))
|
|
||||||
|
|
||||||
;;(unsafe-last b)
|
|
||||||
|
|
||||||
|
|
||||||
;; (defn dangling-1 []
|
|
||||||
;; (let [b [1 2 3]]
|
|
||||||
;; &b))
|
|
||||||
|
|
||||||
;; (defn dangling-2 []
|
|
||||||
;; (let [b [1 2 3]
|
|
||||||
;; r &b]
|
|
||||||
;; r))
|
|
||||||
|
|
||||||
|
|
||||||
;; (defn unique []
|
|
||||||
;; (let [r1 (the &String "DATA")
|
|
||||||
;; r2 (the &String "DATA") ;; should get another lifetime variable than r1
|
|
||||||
;; r3 "DATA"]
|
|
||||||
;; ()))
|
|
||||||
|
|
||||||
|
|
||||||
;; (defn fool [s1 s2]
|
|
||||||
;; (let [r1 (the (Ref String Static) s1)
|
|
||||||
;; r2 (the (Ref String b) s2)]
|
|
||||||
;; (do
|
|
||||||
;; (if (= r1 r2) () ())
|
|
||||||
;; ;;(delete s1)
|
|
||||||
;; ;;(= r1 r2)
|
|
||||||
;; ;;()
|
|
||||||
;; r2)))
|
|
||||||
|
|
||||||
|
|
||||||
;; This should be detected as an error too:
|
|
||||||
;; (defn f [s]
|
|
||||||
;; (let [r &s]
|
|
||||||
;; r))
|
|
||||||
;;(f @"hej")
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
;; (defn magic []
|
|
||||||
;; (let [s @"DATA"]
|
|
||||||
;; &s)) ;; shouldn't work either
|
|
||||||
|
|
||||||
;; (defn simple-fool []
|
|
||||||
;; (let [r (magic) ;; 'magic' returns (Ref String a)
|
|
||||||
;; static (the (Ref String Static) "")]
|
|
||||||
;; (do
|
|
||||||
;; (if (= r static) () ()) ;; shouldn't just be possible to trick 'r' that its lifetime is Static
|
|
||||||
;; ())))
|
|
||||||
|
|
||||||
;; (defn first [xs]
|
|
||||||
;; (Array.nth xs 0))
|
|
||||||
|
|
||||||
;;(defn f [x] (fn [] (IO.println x)))
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
;; (defn g []
|
|
||||||
;; (let-do [s @"DATA"
|
|
||||||
;; r &s
|
|
||||||
;; f (fn [] (IO.println r))]
|
|
||||||
;; ;;(delete s)
|
|
||||||
;; ;;(f)
|
|
||||||
;; f))
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
;; (defn ok [r]
|
|
||||||
;; (let-do [f (fn [] (IO.println r))]
|
|
||||||
;; f))
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
(deftype Blah [x Int])
|
|
||||||
|
|
||||||
(defn trick []
|
|
||||||
(let[s1 (Blah.init 100)
|
|
||||||
r1 &s1
|
|
||||||
g (let [s2 (Blah.init 200)
|
|
||||||
r2 &s2
|
|
||||||
f (fn [] (println* r1 r2))]
|
|
||||||
f)]
|
|
||||||
(g) ;; shouldn't work because 's2' has been deleted and 'r2' is thus a dead reference
|
|
||||||
))
|
|
@ -1,6 +1,8 @@
|
|||||||
; this compiles without needing the core libraries (--no-core flag)
|
;; This compiles without needing the core libraries (--no-core flag)
|
||||||
|
|
||||||
(system-include "limits.h")
|
(system-include "limits.h")
|
||||||
(system-include "carp_stdbool.h")
|
(system-include "carp_stdbool.h")
|
||||||
|
|
||||||
(load "Interfaces.carp")
|
(load "Interfaces.carp")
|
||||||
(load "Bool.carp")
|
(load "Bool.carp")
|
||||||
(load "Pointer.carp")
|
(load "Pointer.carp")
|
||||||
|
@ -1,41 +0,0 @@
|
|||||||
// This is a comment
|
|
||||||
void boo();
|
|
||||||
char hoo();
|
|
||||||
// This is also a comment
|
|
||||||
int foo(int x);
|
|
||||||
float goo(double x, double y);
|
|
||||||
|
|
||||||
// some people use too much whitespace
|
|
||||||
float weird ( double x , double y ) ;
|
|
||||||
|
|
||||||
// Struct types
|
|
||||||
vector2 middle(vector2 p1, vector2 p2);
|
|
||||||
|
|
||||||
// Pointers are also useful to parse
|
|
||||||
void gah(int *x);
|
|
||||||
void dah(int *x, float* y);
|
|
||||||
char *blah(int *x, float* y);
|
|
||||||
|
|
||||||
vector2 *more(vector3* in);
|
|
||||||
|
|
||||||
GLFWAPI GLFWwindow* glfwCreateWindow(int width, int height, const char* title, GLFWmonitor* monitor, GLFWwindow* share);
|
|
||||||
|
|
||||||
|
|
||||||
// TODO:
|
|
||||||
GLFWAPI void glfwPollEvents(void);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// C Macros
|
|
||||||
|
|
||||||
#define K_BLAH 12345
|
|
||||||
#define K_BLAX 0x123
|
|
||||||
#define K_GLAH 12345
|
|
||||||
|
|
||||||
// C function-like macros
|
|
||||||
|
|
||||||
#define X(a, b) a + b
|
|
||||||
#define Y(a, b) {\
|
|
||||||
foo(a, b);\
|
|
||||||
}
|
|
||||||
#define Z(a, b) "hi"
|
|
@ -1,80 +0,0 @@
|
|||||||
(Debug.sanitize-addresses)
|
|
||||||
(Project.config "print-ast" true)
|
|
||||||
|
|
||||||
; (deftype JSON
|
|
||||||
; (Str [String])
|
|
||||||
; (Num [Double])
|
|
||||||
; (Arr [(Array JSON)])
|
|
||||||
; (Obj [(Map String JSON)]))
|
|
||||||
|
|
||||||
;; Refs in structs
|
|
||||||
;; (deftype (Aha a) [x a])
|
|
||||||
;; (def b (Aha.init "bleh"))
|
|
||||||
|
|
||||||
;; Refs in sumtypes
|
|
||||||
;;(def x (Maybe.Just "Heya"))
|
|
||||||
|
|
||||||
;; (defn f []
|
|
||||||
;; (match x
|
|
||||||
;; (Maybe.Just a) a
|
|
||||||
;; (Maybe.Nothing) 0))
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
;; Adding pre-existing functions to interface when it's defined
|
|
||||||
;; (defmodule Foo
|
|
||||||
;; (defn tripoli [x y z] (Int.= 0 (+ x (+ y z)))))
|
|
||||||
|
|
||||||
;; ;; 'foo' will match this interface that is defined AFTER foo
|
|
||||||
;; (definterface tripoli (λ [Int Int Int] Bool))
|
|
||||||
|
|
||||||
;; ;; This should still be added, obviously
|
|
||||||
;; (defmodule Goo
|
|
||||||
;; (defn tripoli [x y z] (Int.= 0 (+ x (+ y z)))))
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
;; Issue #681
|
|
||||||
;; (deftype (X a) [member a])
|
|
||||||
;; (deftype (Y a) [x (X a)])
|
|
||||||
|
|
||||||
;; (defmodule Y
|
|
||||||
;; (defn foo [y]
|
|
||||||
;; (set-x! y (X.init 1))))
|
|
||||||
|
|
||||||
;; (defn main []
|
|
||||||
;; (let [y (Y.init (X.init 10))]
|
|
||||||
;; (Y.foo &y)))
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
;; Nesting match
|
|
||||||
;; (use Maybe)
|
|
||||||
;; (defn main []
|
|
||||||
;; (let [s (Just (Just (Just @"Oh, but hello.")))]
|
|
||||||
;; (match s
|
|
||||||
;; (Just (Just (Just x))) (println* "It's just just just '" &x "'")
|
|
||||||
;; (Just (Just (Nothing))) (IO.println "It's just just nothing.")
|
|
||||||
;; (Just (Nothing)) (IO.println "It's just nothing.")
|
|
||||||
;; (Nothing) (IO.println "Didn't match."))))
|
|
||||||
|
|
||||||
|
|
||||||
;; Match on refs
|
|
||||||
(use Maybe)
|
|
||||||
(defn main []
|
|
||||||
(let [s (Just @"Yo")]
|
|
||||||
(match-ref &s
|
|
||||||
(Just x) (IO.println x)
|
|
||||||
(Nothing) (IO.println "nada"))))
|
|
||||||
|
|
||||||
(defn f []
|
|
||||||
(let [s (Just @"Yo")]
|
|
||||||
(match s
|
|
||||||
(Just x) (IO.println &x)
|
|
||||||
(Nothing) (IO.println "nada"))))
|
|
||||||
|
|
||||||
(defn deep [x]
|
|
||||||
(match-ref x
|
|
||||||
(Nothing) (IO.println "nothing")
|
|
||||||
(Just (Nothing)) (IO.println "just nothing")
|
|
||||||
(Just (Just x)) (IO.println x)))
|
|
@ -1,11 +0,0 @@
|
|||||||
(load "Test.carp")
|
|
||||||
(use Test)
|
|
||||||
(use Int)
|
|
||||||
(use String)
|
|
||||||
|
|
||||||
(defn main []
|
|
||||||
(with-test test
|
|
||||||
(assert-equal test 1 2 "1 == 2")
|
|
||||||
(assert-true test (Int.> (Array.length &[1 2 3]) 1) "len([1 2 3]) == 1")
|
|
||||||
(assert-not-equal test "hi" "bye" "hi != bye")
|
|
||||||
(print-test-results test)))
|
|
@ -25,6 +25,8 @@ else
|
|||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
./scripts/carp.sh ./docs/core/generate_core_docs.carp
|
||||||
|
|
||||||
mkdir -p "$fullPath"
|
mkdir -p "$fullPath"
|
||||||
|
|
||||||
echo
|
echo
|
||||||
@ -41,7 +43,7 @@ cp -r "./docs/" "$fullPath/docs/"
|
|||||||
echo "Copying README.md..."
|
echo "Copying README.md..."
|
||||||
cp -r "./README.md" "$fullPath/README.md"
|
cp -r "./README.md" "$fullPath/README.md"
|
||||||
echo "Copying img..."
|
echo "Copying img..."
|
||||||
cp -r "./img/" "$fullPath/img/"
|
cp -r "./resources/" "$fullPath/resources/"
|
||||||
echo "Copying examples..."
|
echo "Copying examples..."
|
||||||
cp -r "./examples/" "$fullPath/examples/"
|
cp -r "./examples/" "$fullPath/examples/"
|
||||||
|
|
||||||
|
@ -22,11 +22,13 @@ Get-ChildItem -Filter test/*.carp | ForEach-Object -Process {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# TODO Add test for empty project (with and without core)
|
||||||
|
|
||||||
# TODO Add tests for error messages
|
# TODO Add tests for error messages
|
||||||
|
|
||||||
# Just make sure these compile
|
# Just make sure these compile
|
||||||
exitOnError { stack exec carp "--" ./examples/mutual_recursion.carp -b }
|
exitOnError { stack exec carp "--" ./examples/mutual_recursion.carp -b }
|
||||||
exitOnError { stack exec carp "--" ./examples/guessing.carp -b }
|
exitOnError { stack exec carp "--" ./examples/guessing_game.carp -b }
|
||||||
exitOnError { stack exec carp "--" ./examples/no_core.carp --no-core --no-profile -b }
|
exitOnError { stack exec carp "--" ./examples/no_core.carp --no-core --no-profile -b }
|
||||||
exitOnError { stack exec carp "--" ./examples/check_malloc.carp -b }
|
exitOnError { stack exec carp "--" ./examples/check_malloc.carp -b }
|
||||||
|
|
||||||
|
@ -11,19 +11,21 @@ fi
|
|||||||
./scripts/build.sh
|
./scripts/build.sh
|
||||||
|
|
||||||
echo "Build and run some examples"
|
echo "Build and run some examples"
|
||||||
./test/execute.sh ./examples/basics.carp
|
|
||||||
./test/execute.sh ./examples/functor.carp
|
./test/execute.sh ./examples/functor.carp
|
||||||
./test/execute.sh ./examples/external_struct.carp
|
./test/execute.sh ./examples/external_struct.carp
|
||||||
./test/execute.sh ./examples/updating.carp
|
./test/execute.sh ./examples/updating.carp
|
||||||
./test/execute.sh ./examples/sorting.carp
|
./test/execute.sh ./examples/sorting.carp
|
||||||
./test/execute.sh ./examples/globals.carp
|
|
||||||
./test/execute.sh ./examples/generic_structs.carp
|
./test/execute.sh ./examples/generic_structs.carp
|
||||||
./test/execute.sh ./examples/setting_variables.carp
|
|
||||||
./test/execute.sh ./examples/function_members.carp
|
|
||||||
./test/execute.sh ./examples/maps.carp
|
./test/execute.sh ./examples/maps.carp
|
||||||
./test/execute.sh ./examples/lambdas.carp
|
|
||||||
./test/execute.sh ./examples/sumtypes.carp
|
./test/execute.sh ./examples/sumtypes.carp
|
||||||
|
|
||||||
|
echo "Build and run some tests that print (check their output)"
|
||||||
|
./test/execute.sh ./test/produces-output/basics.carp
|
||||||
|
./test/execute.sh ./test/produces-output/function_members.carp
|
||||||
|
./test/execute.sh ./test/produces-output/globals.carp
|
||||||
|
./test/execute.sh ./test/produces-output/lambdas.carp
|
||||||
|
./test/execute.sh ./test/produces-output/setting_variables.carp
|
||||||
|
|
||||||
echo "Actual tests (using the test suite)"
|
echo "Actual tests (using the test suite)"
|
||||||
for f in ./test/*.carp; do
|
for f in ./test/*.carp; do
|
||||||
echo $f
|
echo $f
|
||||||
@ -37,11 +39,17 @@ for f in ./test-for-errors/*.carp; do
|
|||||||
./test/check.sh $f
|
./test/check.sh $f
|
||||||
done
|
done
|
||||||
|
|
||||||
|
echo "Make sure the benchmarks compile."
|
||||||
|
for f in ./bench/*.carp; do
|
||||||
|
echo $f
|
||||||
|
./scripts/carp.sh -b $f
|
||||||
|
done
|
||||||
|
|
||||||
echo "Compile-only examples"
|
echo "Compile-only examples"
|
||||||
compileOnlyExamples="\
|
compileOnlyExamples="\
|
||||||
examples/mutual_recursion.carp \
|
examples/mutual_recursion.carp \
|
||||||
examples/guessing.carp \
|
examples/guessing_game.carp \
|
||||||
examples/check_malloc.carp \
|
examples/unicode.carp \
|
||||||
examples/nested_lambdas.carp
|
examples/nested_lambdas.carp
|
||||||
"
|
"
|
||||||
|
|
||||||
@ -50,6 +58,7 @@ for e in $compileOnlyExamples ; do
|
|||||||
./scripts/carp.sh $e -b
|
./scripts/carp.sh $e -b
|
||||||
done
|
done
|
||||||
|
|
||||||
|
# Make sure a no-core build works
|
||||||
echo ./examples/no_core.carp
|
echo ./examples/no_core.carp
|
||||||
./scripts/carp.sh ./examples/no_core.carp --no-core --no-profile -b
|
./scripts/carp.sh ./examples/no_core.carp --no-core --no-profile -b
|
||||||
|
|
||||||
@ -57,13 +66,13 @@ echo ./examples/no_core.carp
|
|||||||
if [ ${NO_SDL} -eq 0 ]; then
|
if [ ${NO_SDL} -eq 0 ]; then
|
||||||
echo "Compile-only SDL examples"
|
echo "Compile-only SDL examples"
|
||||||
compileOnlySdlExamples="
|
compileOnlySdlExamples="
|
||||||
examples/ant.carp
|
examples/langtons_ant.carp
|
||||||
examples/reptile.carp
|
examples/reptile.carp
|
||||||
examples/game.carp
|
examples/carp_demo.carp
|
||||||
examples/minimal_sdl.carp
|
examples/minimal_sdl.carp
|
||||||
examples/sounds.carp
|
examples/sounds.carp
|
||||||
examples/fonts.carp
|
examples/fonts.carp
|
||||||
"
|
"
|
||||||
|
|
||||||
for e in $compileOnlySdlExamples ; do
|
for e in $compileOnlySdlExamples ; do
|
||||||
echo $e
|
echo $e
|
||||||
|
Loading…
Reference in New Issue
Block a user