Beispiel #1
0
unsigned _position(Env& env) {
    //if (not has_elements<Code>(env,2)) return 1;
   
    Code first = pop<Code>(env);
    Code second = pop<Code>(env);

    if (first->get_stack().size() == 0) {
	if (equal_to(first,second))
	    push(env, 0);
	else
	    push(env,-1);

	return 1;
    }

    const CodeArray& stack = first->get_stack();
    for (int i = stack.size()-1;i >= 0; --i) {
	if (equal_to(stack[i], second)) {
	    push<int>(env, stack.size()-i-1);
	    return stack.size() * second->len();
	}
    }

    push<int>(env, -1);
    return stack.size() * second->len();
}
Beispiel #2
0
unsigned _nth(Env& env) {
    //if (not has_elements<Code>(env,1)) return 1;
    //if (not has_elements<int>(env,1)) return 1;

    Code first = pop<Code>(env);
    int val = pop<int>(env);

    if (first->get_stack().size() == 0) { // nil or atom
	push(env, first);
	return 1;
    }
    
    const CodeArray& stack = first->get_stack();
    val = std::abs(val) % stack.size();
    
    push(env, stack[stack.size()-val-1]);
    
    return first->len();
}
Beispiel #3
0
unsigned _nthcdr(Env& env) {
    //if (not has_elements<Code>(env,1)) return 1;
    //if (not has_elements<int>(env,1)) return 1;

    Code first = pop<Code>(env);
    int val = pop<int>(env);

    if (first->get_stack().size() == 0) { // nil or atom
	push(env, first);
	return 1;
    }
    
    CodeArray stack = first->get_stack();
    val = std::abs(val) % stack.size();

    while(--val >= 0) stack.pop_back();
    
    push(env, Code(new CodeList(stack)));
    
    return first->len();
}