pub fn cdr(params: Vec<Rc<LispValue>>) -> EvalResult {
    if params.len() != 1 {
        return Err("Incorrect number of parameters".to_string())
    }
    match params[0].deref() {
        &LispValue::Cons(_, ref cdr) => Ok(cdr.clone()),
        &LispValue::Nil => Err("Cannot take the cdr of an empty list".to_string()),
        _ => Err("Cannot take the cdr of a non-list".to_string())
    }
}
// cdr function - exposed as (cdr) to Lisp
cdr function - exposed as (cdr) to Lisp
cdr function - exposed as ( cdr ) to Lisp
pub fn cdr(params: Vec<Rc<LispValue>>) -> EvalResult {
    if params.len() != 1 {
        return Err("Incorrect number of parameters".to_string())
    }
    match params[0].deref() {
        &LispValue::Cons(_, ref cdr) => Ok(cdr.clone()),
        &LispValue::Nil => Err("Cannot take the cdr of an empty list".to_string()),
        _ => Err("Cannot take the cdr of a non-list".to_string())
    }
}
pub fn cdr ( params : Vec < Rc < LispValue > > ) -> EvalResult { if params . len ( ) != 1 { return Err ( " " . to_string ( ) ) } match params [ 0 ] . deref ( ) { & LispValue :: Cons ( _ , ref cdr ) => Ok ( cdr . clone ( ) ) , & LispValue :: Nil => Err ( " " . to_string ( ) ) , _ => Err ( " " . to_string ( ) ) } }
cdr function - exposed as (cdr) to Lisp
cdr function - exposed as ( cdr ) to Lisp
params
Vec<Rc<LispValue>>
params
Vec<Rc<LispValue>>