write unificacion reglas operadores listas funciones ejemplo c prolog ffi integer-arithmetic sicstus-prolog

unificacion - Pasar enteros de tamaño arbitrario de Prolog a C



unificacion prolog (1)

En este momento, estoy aprendiendo a relacionar SICStus Prolog con el código C.

Me gustaría tener / usar / ver una implementación en C del "peso Hamming" de enteros de tamaño arbitrario en SICStus Prolog versión 4.

Me parece que necesito funciones de C para probar los tipos de término (SP_is_integer) y funciones de C para acceder a los términos de Prolog (SP_get_integer, SP_get_integer_bytes).

Sin embargo, no estoy seguro de cómo usar SP_get_integer_bytes de una manera robusta y portátil. ¿Podrías, por favor, indicarme un código C sólido y bien hecho haciendo eso?


Úsalo algo como esto:

SP_term_ref tr = ... some term ... int native = 0; // want portable, little endian size_t buf_size = 0; if (!SP_get_integer_bytes(tr, NULL, &buf_size, native) // if buf_size was updated, then there was not really an error && buf_size == 0) { // Something wrong (e.g., not an integer) return ERROR; } // here buf_size > 0 void *buffer = SP_malloc(buf_size); if (buffer == NULL) { return ERROR; } if (!SP_get_integer_bytes(tr, buffer, &buf_size, native)) { // Something wrong. This would be surprising here error(); } // Here buffer contains buf_size bytes, in // twos-complement, with the least significant bytes at lowest index. // ... do something with buffer ... // finally clean up SP_free(buffer);