2017-03-13 8 views
0

나는 문제가 생겼어요 :emacs lisp 언어에서 lambda를 올바르게 사용하는 방법은 무엇입니까? 나는 다음과 같은 코드를 실행하려고 할 때

잘못된 기능 : (람다 (람다 (N) 내가 MX의 ielm으로 실행하는 경우

(defun sum1 
     (lambda (n) 
     (+ n 1))) 

는 다음 메시지를 표시 (+ n은 1)) 무기 호)

내가 분명히 있는지 확인하고 싶습니다

나는 다음과 같은 코드를 사용하는 반면 :

(defun sum1(n) 
     (+ n 1)) 
을 0

이 경우에 람다를 정의하는 방법을 알고 싶습니다.

모든 정보가 허용됩니다. 새내기입니다.

+3

당신은 macroexpand'defun'을 할 수 있습니다.'defalias'sum1 (lambda (n) (+ n1)))' – jenesaisquoi

+3

람다는 익명 함수를위한 것입니다. 당신이 묻고있는 것이 분명하지 않습니다. 예를 들어 가질 수 있습니다. '(defun make-adder (n) (lambda (x) (+ x n)))'은 숫자에 n을 더하는 함수를 반환합니다. 변수의 값으로 익명의 함수를 사용할 수 있습니다 :'(let ((adder (x) (+ x 2)))))'. –

+0

나는 이것에 초보자에게 적합한 답변을 쓰려고했지만 진짜 대답은 다음과 같음을 깨달았다. lisp을 배우고 싶다면 * elisp *로 시작하지 마라. 대신 Common Lisp (elisp보다 전통적이지만 많이 정렬 된 lisp), Scheme (더 현대적인 lisp) 또는 다른 것 (Clojure?)으로 시작하십시오. elisp에는 아무런 문제가 없지만 실제로는 구식입니다 : 그것이하는 일은 좋지만 Lisp을 배우는 방법은 여러분을 혼란스럽게 할뿐입니다. (만약 당신이하고 싶은 것이 emacs를 해킹하는 것이라면, elisp은 물론 시작할 수있는 좋은 곳입니다.) – tfb

답변

2

defun은 함수를 선언하는 데 사용됩니다. (define x variable-expression), 그리고 함수를 선언 할 때이 (define x function-expression) 같은 것을 작성하는 데 사용 : 당신은 변수를 선언하는 데 사용과 같이 그것을 변수 표현을 할당체계에서

. Ofc variable-expression은 이전에 선언 된 다른 변수이거나 리터럴 일 수 있습니다 (예 : define x 5, define x y).

함수 표현식에 대한 동일하지만, 당신이이 같은 익명 함수를 사용하여이 작업을 수행하는 함수를 작성할 때 '문자 그대로'

(define x (lambda (x) (....))) 

lambda (x) (...) 실제로 함수를 반환하고 할당 된 함수 표현식은 x에. 따라서 x는 함수로 선언됩니다.

defun은 실제로 스키마에서 define과 같은 변수가 아니라 함수를 선언합니다. 그래서 당신은 쓸 때 :

(defun sum1 
(lambda (n) 
    (+ n 1))) 

은 정말 무슨 일이 SUM1 실제로 변수 n 반환 n+1을 받아 다른 함수를 반환 인수가없는 함수로 선언 된 것입니다. 당신이 정말로 원하는 것은

sum1기능 대신 당신이 실제로 같은 코드에서 defunlambda를 사용하여 무엇을 얻을 다른 함수을 반환하는 함수로 선언하는 것입니다.

EDIT1 :이 ((sum1) 5)

+0

실제로'defun sum1() (lambda ...))'가 필요합니다 : 당신은 arglist가 필요합니다. 기본값)이 정의는 전혀 작동하지 않습니다. – tfb

+0

그것은 긴 설명 이었지만 가장 명확하지 않았습니다. @tfb가 위와 같이 자신의 문제를 올바르게 해결하는 방법을 알려주십시오. – user2141046

2

lambda처럼 기능을 사용할 수있는 기능을 만들지 만, 이름을 지정하지 않습니다. 함수를 만들 필요가있을 때마다 사용하지만 이름을 지정할 필요는 없습니다. 좋은 예는 한 번만 목록을 정렬하는 데 사용되는 비교 함수입니다.

(let ((l (number-sequence 1 10))) 
    (sort l (lambda (a b) (> a b)))) ;; reversed 

defun 당신이 결코 다시 사용하려고하지하고 함수에 성가신 수 있습니다. 이름을 생각해 내기 위해 약간의 노력이 필요하며 기존 기능을 덮어 쓰지 않아야합니다 (실제로 어렵지는 않습니다. 보통 내 기능에 머리 글자를 붙입니다).

일반적인 남용 사례는 lambda (IMO)은 후크 용입니다. 많은 사람들이 후크에 lambda을 추가 할 것이지만 후크 변수의 값을 살펴 본다면 describe-function을 실행할 수있는 함수 이름 대신에 많은 수의 lisp이 있습니다. 그러나 훨씬 더 나쁜 것은 remove-hook을 사용할 수 없거나 작성하거나 디버깅하는 동안 함수를 다시 정의 할 수 없다는 것입니다.