2014-11-02 2 views
0

두 개의 매개 변수 인 기호 A와 기호 목록 L을 취하는 함수 을 정의하고 L에 A가 요소 중 하나로 포함되어있는 경우에만 t를 반환합니다.복잡한 Lisp 문제

이것이 원래의 질문입니다. 나는 LISP를 처음 사용하고 있으며 구문에 대한 설명과 함께 몇 가지 코드를 원한다. 자바와 C++ 배경 LISP는 매우 다른 특성을 가지고 있습니다. 도와주세요.

지금까지 내 코드는 성공적으로 두 개의 입력을 매개 변수로 사용합니다.

의사 코드 : 나는 A의 값을 목록의 첫 번째 값과 비교 한 다음 목록이 비어있을 때까지 재귀 호출을 사용하여 목록과 변수 A를 다시 함수에 전달합니다. List가 하늘의 경우는 null를 돌려줍니다.

목록에 중첩 루프가있는 경우 어떻게 인식합니까?

예 : (contains #\b '(a (((b))) c)) -> 반드시 인쇄해야합니다.

지금까지 내가 코드 무엇을 :

(defun contains (a list) 
    (if (eq a(car list)) 
     (princ "t") 
     (contains a (cdr list)))) 

(contains #\B '(B a c d e f g)) 

을 나는 목록의 마지막에 검출하는 방법이 필요합니다. 중첩 된 목록을 검색하는 방법.

+0

난 당신이 표준'MEMBER' 기능을 사용할 수 없습니다한다고 가정? – Barmar

+0

질문에 중첩 목록에 들어가야 할 필요는 없습니다. – Barmar

+0

불행히도 아니오, 나는 defun, car cdr cons와 같은 Primitive 함수 만 사용할 수 있습니다. –

답변

2

우선 우선 실수를 수정하겠습니다. #\b은 기호가 아니며 문자입니다. 심볼 목록에서 기호를 찾고 있으므로 일부 문자 -> 기호는 필요하지 않습니다. 변환. 두 번째 : (princ t)을 반환하지 마십시오.

내 짧은 변형 : 너무 테스트의 경우에

(defun contains (sym nested-list) 
    "Find if NESTED-LIST contains a SYM" 
    ;; Check if our list is CONS-cell?. 
    (if (consp nested-list) 
    ;; Recursion on cars and cdrs 
    (or (contains sym (car nested-list)) 
     (contains sym (cdr nested-list))) 
    ;; Elseway just check for equality 
    (eq sym nested-list))) 

CL-USER> (contains 'a '(b c (x b y (f a)) d)) 
T 
CL-USER> (contains 'w '(b c (x b y (f a)) d)) 
NIL 

:

CL-USER> (contains 'b '(a (((b))) c)) 
T 
+0

키워드 음모 란 무엇입니까? –

+0

@AdityaNishtala, 코드에 몇 가지 설명을 추가했습니다. 'CONSP'는 인수가 CONS-CELL인지 확인합니다. 그래서 우리는 기본적으로 목록을 살펴 보았습니다. 우리가 중첩 된리스트를 가지고 있다면, 여기에 들어가고, 여기에 원자가 있다면, 심볼과 평등을 확인하는 것입니다. 그리고'consp'는 키워드가 아니며 단지 함수에 지나지 않습니다. – coredump