2010-12-10 4 views
2

파이썬에서는 다음과 같이 할 수 있습니다.Lisp : 필요한 매개 변수를 결정하는 함수 검사

>>> def foo(x,y,z=1): 
    return x+y*z 

>>> foo.func_code.co_varnames 
('x', 'y', 'z') 
>>> foo.func_defaults 
(1,) 

그리고 foo()를 호출하기 위해 얼마나 많은 매개 변수가 있어야하는지 알 수 있습니다. Common Lisp에서 이것을 어떻게 할 수 있습니까?

+0

이것이 Lisp 변형/구현에 의존하는 것으로 생각됩니다. –

+0

좋은 지적. 나는 명확히하기 위해 편집했다. – Ishpeck

답변

2

대부분의 구현은이 작업을 수행하는 방법을 제공하지만 어느 것도 표준화되지 않았습니다.

CCL> (swank-backend:arglist 'if) 
(TEST TRUE &OPTIONAL FALSE) 
CCL> (swank-backend:arglist 'cons) 
(X Y) 
CCL> (swank-backend:arglist (lambda (a b c &rest args))) 
(A B C &REST ARGS) 

난 당신이 신뢰할 수있는 확실하지 않다 : 당신이 절대적으로 필요하면 스웽크 (SLIME의 CL의 부분) 당신이 원하는 swank-backend:arglist라는 함수를 최대한 멀리 볼 수, 않는있다 나중에 사용할 수 있습니다.

+0

이것은 emacs에서 SLIME을 사용할 때 나에게 효과적 이었지만 gcl에서 컴파일하려고 시도 할 때는 효과가 없었다. (필요 : swank-backend) 나를 위해 그것을 자르지 않습니다. 내가 뭘 놓친거야? – Ishpeck

+0

기능을 사용하기 전에 스웽크를 설치하고로드해야합니다. 안타깝게도, Swank가 GCL (현재 CL 구현은 일반적으로 어쨌든 잘 지원되지 않음)에서 사용할 수 있다고 생각하지 않습니다. ECL (말하자면,'si : function-lambda-list'를 사용할 수 있습니다.) 대신에 당신이 사용하는 특별한 이유가 있습니까? –

+0

나의 한심한 새내기는 그 차이를 알지 못했습니다. 너는 도움이되었다. – Ishpeck

2

일반적으로 대부분의 Lisps에는 일부 패키지에서 ARGLIST라는 기능이 있습니다. LispWorks는 이것을 FINCTION-LAMBDA-LIST라고 부릅니다.

LispWorks에서 정보를 얻으려면 기능 심볼에 커서가 있으면 control-shift-a를 사용하여 arglist를 표시합니다. LispWorks에는로드 할 수있는 'arglist-on-space'기능도 있습니다. 기호와 공백을 입력하면 IDE에 arglist가 표시됩니다.

CL : DESCRIBE 기능도 있습니다. 다양한 객체를 설명합니다. 대부분의 CL 구현에서 함수의 arglist도 표시해야합니다.

다음의 예는 Clozure 커먼 리스프를위한 것입니다

Welcome to Clozure Common Lisp Version 1.6-r14468M (DarwinX8664)! 
? (defun foo (x y &optional (z 1)) (+ x (* y z))) 
FOO 

? (arglist #'foo) 
(X Y &OPTIONAL Z) 
:ANALYSIS 

? (describe #'foo) 
#<Compiled-function FOO #x302000550F8F> 
Name: FOO 
Arglist (analysis): (X Y &OPTIONAL Z) 
Bits: 8405508 
... 
0

이 편집 다만, 점액을 알고 싶어 + 이맥스는 당신을 위해 알아서됩니다.

(format

가 바닥에있는 미니 버퍼에 형식의 인수를 표시합니다 입력 이맥스 LISP 모드 + 점액,합니다.

관련 문제