本帖最后由 yjpzc 于 2013-1-31 22:00 编辑
实例: 解读无痕老师的表分段函数 (defun xl-div (lst x / lst2) (foreach n lst (if (and lst2 (/= x (length (car lst2)))) (setq lst2 (cons (append (car lst2)(list n))(cdr lst2))) (setq lst2 (cons (list n) lst2)) ) )(reverse lst2))(setq lst ‘(0 0 11)) (xl-div lst 2) 函数执行第一次 N 的值为0 表lst2 的值为空 (car lst2) 返回nil (lengthnil) 返回 0 判断 (and ‘() T) 返回值为 nil所以程序执行 (setqlst2 (cons (list n) lst2)) 返回 ‘((0 )) 函数执行第二次 N 的值为0 表lst2 的值为‘(( 0 )) (car lst2) 返回‘( 0 ) (length‘( 0 )) 返回 1 判断表长度 (and ‘(( 0 )) T) 返回值为 T所以程序执行 (setq lst2 (cons (append (car lst2)(list n))(cdr lst2))) 返回‘(‘( 0 0)) 函数执行第三次 N 的值为1 表lst2 的值为‘(‘( 0 0)) (car lst2) 返回‘( 0 0) (length ‘(0 0 ) ) 返回 2 判断表长度 (and ‘(0 0) nil) 返回值为 nil所以程序执行 (setq lst2(cons (list n) lst2)) 返回 ‘(‘( 1) ‘(0 0 )) 函数执行第四次 N 的值为1 表lst2 的值为‘(‘( 1) ‘(0 0 )) (car lst2) 返回‘(1) (length ‘(1)) 返回 1 判断表长度 (and ‘(‘( 1) ‘(0 0 )) T) 返回值为 T 所以程序执行 (setq lst2(cons (append (car lst2)(list n))(cdr lst2))) 返回 ‘(‘(1 1) ‘(0 0)) |