2013-04-19 2 views
2

현재 기본 주소록을 만드는 clisp 지정 작업을하고 있습니다. 그러나이 과제에 대한주의 사항은 단지 cons, car, cdr, cond, if, eq, assoc 및 setf를 사용하여 과제를 완료 할 수 있다는 것입니다 ...절차가 제한된 목록 (lisp) 구현

간단히 자체 목록을 구현하고 추가하기로 결정했습니다. 절차를 단순화하는 절차가 있지만 특히 잘 작동하지는 않습니다. 솔직히, 위의 절차 만 사용하여 점으로 구분되지 않은 목록을 생성하는 방법에 대해서는 분실했습니다. 여기

내가 할 시도하고있는 무슨이다 :
(defun create-entry (name email phone-number address) 
    (list (cons 'name name) 
     (cons 'email email) 
     (cons 'phone-number phone-number) 
     (cons 'address address))) 

은 분명히 내가 여기에 목록을 사용할 수 없습니다

, 양론이 이름을 그에게 이메일, 죄수 전화 번호에 내 유일한 해결책은 지금까지 벤을 가지고 있으며, 단점은 정확히 내가 무엇을 찾고있는 것이 아닙니다.

TL; DR 단지 cons, car, cdr, cond, if, eq, assoc 및 setf 만 사용하여 목록 프로 시저를 구현하는 방법이 있습니까?

답변

3

리스트는 단지 한 장의 연속 셀이며, 다음 셀로 연결되며, 마지막 cdr은 nil입니다.

(defun create-entry (name email phone-number address) 
    (cons (cons 'name name) 
    (cons (cons 'email email) 
     (cons (cons 'phone-number phone-number) 
     (cons (cons 'address address) 
      nil))))) 

또한,이 같은 list 기능의 자신의 버전을 구현할 수 : 따라서 당신은이처럼 create-entry 기능을 구현할 수

(defun your-own-list (&rest l) l) 

(defun create-entry (name email phone-number address) 
    (your-own-list 
    (cons 'name name) 
    (cons 'email email) 
    (cons 'phone-number phone-number) 
    (cons 'address address))) 

을하지만이의 정신에가는 것처럼 그 느낌 할당.

+0

남자, 나는 그것을 어루 만져 보았습니다. 나는 내가 당신의 첫 번째 제안과 비슷한 것을했을 것이라고 생각했지만,리스트 내에서리스트 내에서리스트로 끝났다. 고마워! –

1

은 이미 확인하지만 알다시피, 그래서 결국 당신은 할 줄 :

구조화 된 목록을 만들 수 quasiquote 편리한 구문을 사용
(defun create-entry (name email phone-number address) 
    `((name . ,name) 
    (email . ,email) 
    (phone-number . ,phone-number) 
    (address . ,address))) 

.

+1

좋은 소식! :) (quasiquote는 허용 된 * 레퍼토리 *의 일부가 아니지만). –