//StackArray.h #ifndef STACKARRAY_H #define STACKARRAY_H #define MAX 10 typedef struct _stackarray{ int array[MAX]; int size; } StackArray; StackArray * newStackArray(); int pushStackArray(StackArray *, int ); int popStackArray(StackArray *); int fullStackArray(StackArray *); int emptyStackArray(StackArray *); void displayStackArray(StackArray *); void delete(StackArray *); #endif //StackArray.c #include <stdio.h> #include <stdlib.h> #include <string.h> #include "StackArray.h" StackArray * newStackArray(){ StackArray * stack = malloc(sizeof(StackArray)); int i; for(i = 0; i < MAX; i++){ stack->array[i] = 0; } stack->size = 0; return stack; } int pushStackArray(StackArray * stack, int item){ if(stack->size < MAX){ stack->array[stack->size] = item; stack->size++; return item; } else { printf("The stack is full\n"); return 0; } } int popStackArray(StackArray * stack){ if(stack->size > 0){ int top = stack->array[stack->size-1]; stack->size--; return top; } else { return 0; } } int fullStackArray(StackArray * stack){ return stack->size == MAX ? 1 : 0; } int emptyStackArray(StackArray * stack){ return stack->size == 0 ? 1 : 0; } void displayStackArray(StackArray * stack){ if(stack->size > 0){ int i; for(i = 0; i < stack->size; i++){ printf("%d ", stack->array[i]); } printf("\n"); } else if (stack->size == 0) { printf("The stack is empty\n"); } } void delete(StackArray * stack){ free(stack); } Compile and create the Shared Library (Linux): gcc -c -fPIC StackArray.c gcc -g -Wall -shared -o libStackArray.so StackArray.o In Anarki type in: ($:require ffi/unsafe ffi/unsafe/define ffi/unsafe/alloc) ;Define the library ($:define-ffi-definer define-StackArray (ffi-lib "/home/conan/Documents/Arcprojects/ffi/stack/libStackArray")) ;Define the functions input and ouput ($:define-StackArray newStackArray (_fun -> _pointer )) ($:define-StackArray delete (_fun _pointer -> _void )) ($:define-StackArray pushStackArray (_fun _pointer _int -> _void)) ($:define-StackArray popStackArray (_fun _pointer -> _int)) ($:define-StackArray fullStackArray (_fun _pointer -> _int)) ($:define-StackArray emptyStackArray (_fun _pointer -> _int)) ($:define-StackArray displayStackArray (_fun _pointer -> _void)) ;assign the functions a symbol to use in Anarki (= newSA $.newStackArray) (= deleteSA $.delete) (= pushSA $.pushStackArray) (= popSA $.popStackArray) (= fullSA? $.fullStackArray) (= emptySA? $.emptyStackArray) (= displaySA $.displayStackArray) ;To use the functions (= stack (newSA)) (emptySA? stack) (pushSA stack 1) (displaySA stack) (fullSA? stack) (emptySA? stack) (popSA stack) (deleteSA stack) ;A lispy solution using closures with very little effort... a macro can be used to clean up the middle. (def Stack () (with (items nil acc 0) (fn msg (let it (car (cdr msg)) (case (car msg) set (= acc (len it) items it ) empty? (is items nil) push (do (= acc (inc acc)) (= items (join items (list it))) ) pop (if (> acc 0) (do (= acc (inc acc -1)) (= items (butlast items)))) peek items size acc))))) (= stack (Stack)) (stack 'empty?) (stack 'push 1) (stack 'peek) (stack 'pop) (stack 'set '(1 2 3 4 5 6 7 8 9 10))