[Ecls-list] A cl_funcall and cl_safe_eval question.

Brian Algeri bdasp at hotmail.com
Sat Aug 7 09:20:08 UTC 2004


Just a small question that I have?
I hope the formating is not messed up.


in the below c code:

form = c_string_to_object(str5);
recset = cl_safe_eval(form,Cnil,Cnil);

The above code snip works:
str5 evaluates to "(cla:get-rec 1 cla::*person-tbl*)"
with 1 being whatever the record key is.
recset now contains a list of the record.


This does not work:

form = c_string_to_object("cla:get-rec");
recset = cl_funcall(3, form, MAKE_FIXNUM(rec),

Where rec is the record key.
I get the scrolling index 0 errors, when paused and scrolled to
the top it says that cla::*person-tbl* is not a hash-table, which
it is - works in the ecl shell. I also tried to export
cla::*person-tbl* and used the cla:*person-tbl format and this also
does not work. cla is the nickname for my lisp package.


I guess it doesn't matter as I can just use the cl_safe_eval but,
out of curiosity why does the cl_safe_eval work and the cl_funcall
does not for this particular instance.  I am using cl_funcall
at a later point in this function which works --see below code.


Reference code follows:

;;;; These work with the below c code

(defun get-rec (key hash)
  (gethash key hash))

(defun get-state-recs ()
  (let ((recset nil))
    (maphash #'(lambda (k v)
		 (push (list k v) recset))

// this works with the above lisp code
int GetContactRec(HWND hWnd, long rec)

  cl_object recset, rec2, hold, form, key;
  char str1[6];
  char str2[] = "(cla:get-rec ";
  char str3[] = " cla::*person-tbl*)";
  char str4[5];
  char str5[40];
  int x, index, state;
  HWND comboBox = GetDlgItem(hWnd,IDC_COMBOSTATE);
  const nstates = 50;

  // build string
  ltoa(rec, str4, 10);
  strcpy(str5, str2);
  strcat(str5, str4);
  strcat(str5, str3);

  form = c_string_to_object(str5);
  recset = cl_safe_eval(form,Cnil,Cnil);

  // set dialog edit controls
  hold = cl_cadr(recset);
  SetDlgItemText(hWnd, IDC_FNAME, hold->string.self);
  hold = cl_fourth(recset);
  SetDlgItemText(hWnd, IDC_LNAME, hold->string.self);
  hold = cl_sixth(recset);
  SetDlgItemText(hWnd, IDC_TITLE, hold->string.self);
  hold = cl_eighth(recset);
  SetDlgItemText(hWnd, IDC_DEPT, hold->string.self);
  hold = cl_tenth(recset);
  SetDlgItemText(hWnd, IDC_ADDR, hold->string.self);
  hold = cl_nth(MAKE_FIXNUM(11),recset);
  SetDlgItemText(hWnd, IDC_CITY, hold->string.self);
  hold = cl_nth(MAKE_FIXNUM(15),recset);
  ltoa(fixint(hold), str1, 10);
  SetDlgItemText(hWnd, IDC_ZIP, str1);
  hold = cl_nth(MAKE_FIXNUM(13),recset);
  state = fixint(hold);

  //*** organizations listbox code will go here

  //*** phone numbers listbox code will go here

  // fill state combo box
  form = c_string_to_object("cla:get-state-recs");
  recset = cl_funcall(1,form);

  // first record
  rec2 = cl_car(recset);
  hold = cl_cdr(recset);

  for (x = 0; x < nstates; x++)
    key = cl_car(rec2);
    rec2 = cl_cadr(rec2);

    index =  SendMessage(comboBox, CB_ADDSTRING, 0,
    SendMessage(comboBox, CB_SETITEMDATA, index,

    // next record
    rec2 = cl_car(hold);
    hold = cl_cdr(hold);


  // set combo box to correct state or country
  for (x = 0; x < nstates; x++)
    if (SendMessage(comboBox, CB_GETITEMDATA, x, 0) == state)
      SendMessage(comboBox, CB_SETCURSEL, x, 0);

  return 0;


Brian Algeri

Express yourself instantly with MSN Messenger! Download today - it's FREE! 

More information about the ecl-devel mailing list