[Ecls-list] About Embed ECL into C programs

Huang Jianshi hadeshuang at gmail.com
Mon Nov 20 00:32:53 UTC 2006


Ok, let me state my problem clear. I have a poker game client written
in C and I want to add some logic to the client. I wrote the logic
part in Lisp and left the communication part in C.

I need to submit it in the form of source code so the people there
could make a standalone program on their machine (I'm in a programming
contest actually). I use ECL to generate the player.c from lisp code.
Actually, it has two entries: change-cards-entry and play-cards-entry,
and after the lisp-to-C compilation, their name became
L1change_cards_entry and L2play_cards_entry, in player.c

So I wrote the interface for the 2 functions in lisp_interface.c.
Their function is just to wrap the C array into cl_array, and the
element type is fixnum. For testing, change-cards-entry and
play-cards-entry simply print out the data they receive.

That's the senarios. And I got these compilation errors. I could paste
the code here. So here it is:

[lisp_interface.c]

#include <ecl.h>
#include "lisp/player.c"


void cl_select_cards_to_change(int cards[8][15]) {

  int i,j;

  cl_object element_type = cl_make_symbol(make_base_string_copy("fixnum"));
  cl_object table = si_make_pure_array(6, element_type, Cnil, Cnil,
Cnil, 8, 15);

  /* boxing */
  for (i = 0; i < 8; i++) {
	for (j = 0; j < 15; j++) {
	  cl_object value = make_integer(cards[i][j]);
	  aset(aref(table, i), j, value); /* fill the data into the cl_array */
	}
  }

  /* here, call the lisp function */
  table = L1change_cards_entry(table);

  /* unboxing */
  for (i = 0; i < 8; i++) {
	for (j = 0; j < 15; j++) {
	  int value = fixint(aref(aref(table, i), j));
	  cards[i][j] = value;		/* change the cards */
	}
  }


}




void cl_select_cards_to_play(int cards[8][15]) {

  int i,j;

  cl_object element_type = cl_make_symbol(make_base_string_copy("fixnum"));
  cl_object table = si_make_pure_array(6, element_type, Cnil, Cnil,
Cnil, 8, 15);

  /* boxing */
  for (i = 0; i < 8; i++) {
	for (j = 0; j < 15; j++) {
	  cl_object value = make_integer(cards[i][j]);
	  aset(aref(table, i), j, value); /* fill the data into the cl_array */
	}
  }

  /* here, call the lisp function */
  table = L2play_cards_entry(table);

  /* unboxing */
  for (i = 0; i < 8; i++) {
	for (j = 0; j < 15; j++) {
	  int value = fixint(aref(aref(table, i), j));
	  cards[i][j] = value;		/* change the cards */
	}
  }


}


[player.lisp]

(defun change-cards-entry (table)
  (let ((row-dim (array-dimension table 0))
		(col-dim (array-dimension table 1)))
	(dotimes (i row-dim)
	  (dotimes (j col-dim)
		(princ (aref table i j))))))

(defun play-cards-entry (table)
  (let ((row-dim (array-dimension table 0))
		(col-dim (array-dimension table 1)))
	(dotimes (i row-dim)
	  (dotimes (j col-dim)
		(princ (aref table i j))))))



[player.c] -- generated by player.lisp


/*	function definition for CHANGE-CARDS-ENTRY                    */
static cl_object L1change_cards_entry(cl_object V1)
{ VT2 VLEX2 CLSR2
	cl_object value0;
	{
TTL:
	{cl_object V2;                            /*  ROW-DIM
                        */
	cl_object V3;                             /*  NIL
                         */
	cl_fixnum V4;                             /*  COL-DIM
                         */
	V3= cl_array_dimension(V1,MAKE_FIXNUM(0)) /*  ARRAY-DIMENSION      */;
	V4= object_to_fixnum(cl_array_dimension(V1,MAKE_FIXNUM(1)) /*
ARRAY-DIMENSION */);
	V2= V3;
	{cl_object V5;                            /*  I
                        */
	V5= MAKE_FIXNUM(0);
	goto L9;
L8:;
	{cl_object V6;                            /*  %DOTIMES-VAR
                        */
	cl_object V7;                             /*  J
                         */
	V6= MAKE_FIXNUM(V4);
	V7= MAKE_FIXNUM(0);
	goto L15;
L14:;
	T0= cl_aref(3,V1,V5,V7)                   /*  AREF
               */;
	princ(T0,Cnil);
	V7= one_plus(V7);
L15:;
	if(!(number_compare(V7,V6)<0)){
	goto L19;}
	goto L14;
L19:;
	goto L10;
	}
L10:;
	V5= one_plus(V5);
L9:;
	if(!(number_compare(V5,V2)<0)){
	goto L23;}
	goto L8;
L23:;
	value0=Cnil; NVALUES=1;
	return value0;
	}
	}
	}
}
/*	function definition for PLAY-CARDS-ENTRY                      */
static cl_object L2play_cards_entry(cl_object V1)
{ VT3 VLEX3 CLSR3
	cl_object value0;
	{
TTL:
	{cl_object V2;                            /*  ROW-DIM
                        */
	cl_object V3;                             /*  NIL
                         */
	cl_fixnum V4;                             /*  COL-DIM
                         */
	V3= cl_array_dimension(V1,MAKE_FIXNUM(0)) /*  ARRAY-DIMENSION      */;
	V4= object_to_fixnum(cl_array_dimension(V1,MAKE_FIXNUM(1)) /*
ARRAY-DIMENSION */);
	V2= V3;
	{cl_object V5;                            /*  I
                        */
	V5= MAKE_FIXNUM(0);
	goto L34;
L33:;
	{cl_object V6;                            /*  %DOTIMES-VAR
                        */
	cl_object V7;                             /*  J
                         */
	V6= MAKE_FIXNUM(V4);
	V7= MAKE_FIXNUM(0);
	goto L40;
L39:;
	T0= cl_aref(3,V1,V5,V7)                   /*  AREF
               */;
	princ(T0,Cnil);
	V7= one_plus(V7);
L40:;
	if(!(number_compare(V7,V6)<0)){
	goto L44;}
	goto L39;
L44:;
	goto L35;
	}
L35:;
	V5= one_plus(V5);
L34:;
	if(!(number_compare(V5,V2)<0)){
	goto L48;}
	goto L33;
L48:;
	value0=Cnil; NVALUES=1;
	return value0;
	}
	}
	}
}
	
#include "/Users/huangjianshi/tmp/daihinmin20061106/client/lisp/player.data"
#ifdef __cplusplus
extern "C"
#endif
void init_CODE(cl_object flag)
{ VT1 CLSR1
	cl_object value0;
	cl_object *VVtemp;
	if (!FIXNUMP(flag)){
	Cblock=flag;
	#ifndef ECL_DYNAMIC_VV
	flag->cblock.data = VV;
	#endif
	flag->cblock.data_size = VM;
	flag->cblock.temp_data_size = VMtemp;
	flag->cblock.data_text = compiler_data_text;
	flag->cblock.data_text_size = compiler_data_text_size;
	return;}
	#ifdef ECL_DYNAMIC_VV
	VV = Cblock->cblock.data;
	#endif
	VVtemp = Cblock->cblock.temp_data;
	cl_def_c_function(VV[0],(void*)L1change_cards_entry,1);
	cl_def_c_function(VV[1],(void*)L2play_cards_entry,1);
}



Regards,
p-s.




More information about the ecl-devel mailing list