2011-07-30 6 views
3

나는 목록 X의 모든 요소는 속성 A가 들어있는 경우 확인하는 함수를 작성하려고 해요, 그래서 내가 쓴 :함수를 lisp에서 변수로 사용하려면 어떻게해야합니까?

(defun check (a x) 
    (if (listp x) 
    (eval (cons 'and (mapcar #'a x))))) 

을했지만 작동하지 않습니다. (기본적으로 a을 함수의 이름, 예를 들어 blablabla으로하고, 확인 함수의 본문에 #'a을 쓰고 싶습니다. blablabla이라는 함수 대신에 a이라는 함수를 사용하고 싶습니다.) 위 코드는 ' 일하지 마라. 나는 Lisp에서 함수를 플러그인 할 수 있어야한다고 생각한다. 어떻게 해결할 수 있습니까?

(그것은 LISP에 그대로 내 첫 날, 그래서 바보 같은 질문 수 있습니다) 및 BTW 나는 개인 버전 Lispworks 6.0을 사용하고 있습니다)

+0

그것은 유용 할 수 있습니다 :

(defun is-even-p (n) (declare (type number n)) (the boolean (= 0 (mod n 2)))) 

당신은 여기에 # '을 배치해야합니다. – whoplisp

+0

이 경우 EVAl을 사용하는 것은 실수입니다. –

+0

Common Lisp btw. 이미이 기능을 제공합니다. 그것은 모두라고합니다. –

답변

6

는 날카로운 인용 구문 여기에 사용할 필요가 없습니다. 그 목적은 변수 위치에서 함수 이름을 사용하는 것이지만 a은 이미 변수입니다. #'a 대신 a으로 작성하십시오.

+0

그것은 작동한다. 고마워. –

3

당신은 당신이 apply을 사용할 수 있습니다 eval 필요하지 않습니다. . 문제점 : a을 인수로 제공 했으므로 funcall이 필요합니다. (편집 :이 경우가 아닙니다.)이 함수에서 a가 아니라 a 함수를 참조하면됩니다.

(defun check (a xs) 
    (if (listp xs) 
     (every #'identity (mapcar a 
           xs)))) 

더 나은, loop를 사용

최저
(defun check (a xs) 
    (if (listp xs) 
     (loop for x in xs 
      always (funcall a x)))) 

every를 사용

(defun check (a xs) 
    (if (listp xs) 
    (every a xs))) 
+2

이 경우'funcall'은 필요 없습니다. 'mapcar'는 첫 번째 인자로 함수 지정자를 받아들입니다. 그래서'a'가 심볼로 평가된다면'(mapcar a ...)'는 잘 동작 할 것입니다. –

+2

또한, 매크로 인'and'를'apply' 할 수 없습니다. 'every'라는 함수가 종종 대신 사용됩니다 (이 특별한 경우에는'identity'와 같은 것을 사용해야합니다). –

+0

나는 그것을 시도하고 "오류 : 그리고 이름 매크로 - 나쁜 인수에 대한 기능." 그래서 내가 평가하기 시작했다. –

2

다음은 내가 당신의 체크 기능과 같은 것을 쓰는 방법입니다. 나는 그 이름을 더 알기 쉽게 설명하려고 노력했다.

(defun are-all-elements-fullfilling-fun-p (fun ls) 
    (every #'identity (mapcar fun ls))) 

편집 : 짧은 더 나은 정의가

(defun are-all-elements-fullfilling-fun-p (fun ls) 
     (every fun ls))) 

입니다하는 것으로 이제 우리는이 기능을 호출 할 가정 해 봅시다. 가능한 경우 선언문을 사용하는 경향이 있습니다. 컴파일러가 오류를 파악할 수 있다면 디버깅이 쉽고 편하게 수행 할 수 있습니다. 또한 코드가 더 빨리 실행됩니다. 당신은 당신이 달성하려는 작업에 조금 정교한 경우

(are-all-elements-fullfilling-fun-p #'is-even-p '(1 2 3 4)) 
(are-all-elements-fullfilling-fun-p #'is-even-p '(38 2 4)) 
+0

선언문을 어디에나 추가하면 코드를 변경하기가 어려워지고 속도가 향상된다는 보장이 없으며 일을 더 느리게 만들 수도 있습니다. 윈 - 윈 제안이 아닙니다. – Xach

+0

동의합니다. 하지만 제가 일하는 문제들에 대해서는 종종 도움이됩니다. – whoplisp

+0

당신의'모든 요소가 성취 FUN-P' 기능이'EVERY'와 다른 방식으로 어떻게 될 수 있는지 정말로 알 수 없습니다. '# 'IDENTITY'와'MAPCAR' 호출을 건너 뛰는 것보다 당신의 정의가 더 나은 상황은 무엇입니까? –

관련 문제