2013-07-24 2 views
-3

나는 c에서 scheme을 구현하는 크로스 컴파일러를 구현하려고한다. 이것을 위해 나는 단점과리스트를 사용하여 기본 스키마 구조를 구현하려고합니다. 아래에 표시된 코드는 죄수 용입니다. consed 객체가 정수이고 다른 consed 객체가 아닌 경우 엔 car에 액세스 할 수 없습니다.정수 인 경우이 코드에서 consed 오브젝트에 대해 car와 cdr을 어떻게 인쇄 할 수 있습니까?

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <ctype.h> 

typedef enum 
    {PAIR, NUMBER} object; 

typedef struct node cons_object; 

struct node { 
    object type; 
    union 
    {  
    int i; 
    float f; 
    char* string; 
    struct pair { 
     cons_object* car; 
     cons_object* cdr; 
    } pair; 
    } data; 
}; 

cons_object* cons(cons_object* x, cons_object* y) 
{ 
    cons_object* obj; 
    obj = malloc(sizeof(cons_object*)); 
    obj->type = PAIR; 
    obj->data.pair.car = x; 
    obj->data.pair.cdr = y; 
    return obj; /*returns the pointer car*/ 
} 

cons_object* car(cons_object* list) /*takes in a consed object*/ 
{ 
    cons_object* y; 
    y = list->data.pair.car; 
    return y;  /* returns the pointer of another consed object */ 
} 

cons_object* cdr(cons_object* list) 
{ 
    cons_object* z; 
    z = list->data.pair.cdr; 
    return z;   /* returns the pointer of another consed object */ 
} 

void eval_cons(cons_object* pair) 
{ 
    cons_object* first; 
    cons_object* second; 
    int *a;      /* An integer type pointer to dereference the values returned by car and cdr   pointers */ 

    first = car(pair); 
    second = cdr(pair); 
{ 
    if(first->type == PAIR){ 
    eval_cons(first);  // If car is a cons-ed object, it is again sent to the eval function 
    } 
    else 
{ 
    a = (int *)&first; /* tried type casting too */ 
    printf("%d",*a); 
} 
} 
if(second->type == PAIR)   
    eval_cons(second); // If cdr is a cons-ed object, it is again sent to the eval function 

else 
    { 
    a = (int *)&second; 
    printf("%d",*a);    // prints the dereferenced value 
    } 
} 

// If eval starts working then we could test it from the following sample code: 


int main() 

{ 
    eval_cons(cons(3,4)); /* cant find a way to access 3 and 4 */ 
    getchar(); 
    return 0; 
} 
+0

또한

cons_object a = { NUMBER, .data.i = 3}; cons_object b = { NUMBER, .data.i = 4}; eval_cons(cons(&a, &b)); 

해야한다. 당신이해야 할 일은 정수를 cons 객체로 바꾸는 cons 함수를 만든 다음 cons (cons_object * x/y)를 호출하는 것입니다. 이 두 정수 (3과 4)를 사용하면 cons 객체를 malloc (계속 유지) 한 다음 3,4 쌍을 cons 객체로 변환해야합니다. cons_object * cons (int x, int y) – Magn3s1um

+0

비록 3과 4 consed 객체를 만들지 만, 정수에 접근 할 방법이 없기 때문에 접근 할 수 없습니다.이 경우에는 – user2585933

+2

sizeof (cons_object *)가 잘못되었습니다. 포인터의 크기를 malloc하면 4 또는 8 바이트 (32/64 비트 종속) 만 리턴합니다. 모든 포인터는 주소를 담을 충분한 공간 만 있으면됩니다. 귀하의 구조체 귀하의 구조체의 크기로 malloc'd해야하고, malloc (sizeof (struct cons_object))해야합니다; 그런 다음 포인터 내부에 액세스하면 malloc도 필요합니다. char * 문자열에 값을 넣으려면 충분한 공간을 malloc하고이 주소를 문자열로 반환 한 다음 원하는 위치로 memcpy를 반환해야합니다. cons 포인터와 동일합니다. – Magn3s1um

답변

0
eval_cons(cons(3,4)); 

아마, 당신은 단점으로 두 개의 정수, 다른 죄수 객체되지 포인터를 전달하는

int a; 
a = first->data.i;//also second 
printf("%d ",a); 
+0

하지만이 방법은이 함수는 자동차 및 cdr 장소에서 다른 consed 개체가있을거야 경우 작동하지 않습니다. 그래서 나는 각 consed 객체에 PAIR 태그를 사용하고있다. – user2585933

+0

@ user2585933 다시 한번 생각해 보자. – BLUEPIXY