문제

나는 기능을 인수로 전달하고 다른 함수 내에서 해당 함수를 호출하려고합니다.

내 코드의 조각은 다음과 같습니다.

(defun getmove(strategy player board printflag)
(setq move (funcall strategy player board))
(if printflag
    (printboard board))

전략은 'Randomstrategy'와 같은 2 차원 목록에 표시되는 기호로 전달됩니다.

오류가 계속됩니다. "funcall : 'randomstrategy는 함수 이름이 아닙니다. 대신 기호를 사용해보십시오 ...

전략을 'randomstrategy로 바꾸면 잘 작동합니다. RandomStrategy를 독립적으로 전화 할 수도 있습니다. 문제는 무엇입니까?

도움이 되었습니까?

해결책

Stategy는 기능적 값을 가진 변수입니까? #'구문 매크로를 사용하지 않는 경우. 그것은 #'전략입니다. 또는 그냥 (기능이 글로벌 인 경우) '전략

왜요? funcall 호출의 주장이 평가 되었기 때문입니다. 그리고 귀하의 전략 기호는이 경우 가변 이름 일뿐입니다. 이 값 'randomstrategy. 그러나 당신은 funcall에 함수를 주어야합니다. 기호가있는 경우 기능에 액세스하는 방법?

세 가지 경우 :

1) Symbol may denote variable with functional value
2) Symbol may denote global function (symbol-function - is the accessor in this case.
3) Symbol may denote local function (flet, labels and so on)

RandomStrategy 기능을 정의하는 것을 잊어 버린 것 같습니다

(Defun RandomStrategy 등 ...)

FUNCALL: 'RANDOMSTRATEGY

(setq 전략 ''randomstrategy)가있을 수 있습니까?

그러면 전략은 'Randomstrategy'로 평가됩니다. '기호 이름 앞에서'알았습니까? 'Randomstrategy <=> (QUOTE RandomStrategy) 적절한 기능 이름이 아닙니다.

다른 팁

문제는 변수입니다 strategy 기호가 포함되어 있지 않습니다 randomstrategy 오히려 목록 (!) 'randomstrategy (이것은 속기 표기법입니다 (quote randomstrategy)).

이제, 당신 ~할 수 있었다, 물론 함수를 통해 목록에서 기호를 추출하십시오. second, 그러나 그것은 실제 문제를 다루는 것만으로도 통화 체인의 어딘가에있을 것입니다. 기능으로 전달 된 논쟁을 결정하려고 노력하십시오. getmove ~이다 'randomstrategy, 아니다 randomstrategy 그대로. (아마도 당신은 인용 된 목록 안에 인용문을 잘못 사용했을까요?)

오, 그리고 사실에 의해 혼란스러워하지 마십시오. (funcall 'randomstrategy ...) 작품 : 표현 'randomstrategy 결국 그 자체로 평가하는 것이 아니라 상징으로 randomstrategy.

어디서나 전략을 설정 했습니까? 그것은 범위의 문제처럼 보입니다.

이 시도

(setq strategy 'randomstrategy)
(setq move (funcall strategy player board))

코드를 보지 못하고 있습니다. 나는 당신이 다음과 같은 일을하고 있다고 상상하고 있습니다.

(Defun RandomStrategy (ABC) ...)

그런 다음이 작업을 수행합니다.

(GetMove 'RandomStrategy XYZ)

당신이하고 싶은 것은 "randomstrategy"함수를 전달하여 #'을 사용하여 getmove입니다.

(GetMove #'RandomStrategy XYZ)

CommonLisp에서 #'는 기호에 바인딩 된 함수를 생성합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top