2010-05-28 6 views
1

Scheme에서 Common Lisp로 일부 코드를 번역해야합니다. 이제 다음과 같은 내용이 있습니다.scheme2lisp :: define function을 매개 변수로 전달하십시오.

(defun sum (term a next b) 
    (if (> a b) 
    0 
    (+ (term a) (sum term (next a) b)))) 

(defun sum-int (a b) 
    (defun (ident x) x) 
    (sum ident a 1+ b)) 

그러나 오류가 발생합니다.

*** - DEFUN : 함수의 이름이 상징,하지 (IDENT의 X)

도움말 나를 plese해야합니다. 감사

UPD 원래 코드 :

(define (sum term a next b) 
    (if (> a b) 
    0 
    (+ (term a) (sum term (next a) b)))) 

(define (sum-int a b) 
    (defun (identity x) x) 
    (define identity a 1+ b)) 
+0

그건 엉망이 됐어 ... 원래의 스키마 코드를 게시 할 수 있습니까? – ivans

+0

original code added –

+0

내가 말했듯이, Scheme은 훨씬 더 깨끗해 보입니다 : -/ – ivans

답변

1
(defun sum (term a next b) 
    (if (> a b) 
     0 
     (+ (funcall term a) (sum term (funcall next a) next b)))) 

(defun sum-int (a b) 
    (flet ((ident (x) x)) 
    (sum #'ident a #'1+ b))) 

또 다른 CL 테스팅 (테스트되지 않음).

+4

커먼 리스프는 이미'identity'를 가지고있다. 당신은 그것을 정의 할 필요가 없다. – Svante

+1

주어진 예제를 다시 작성했습니다. 문제는 함수를 정의하는 것이었고, 따라서 ID 함수가 아닌, FLET을 사용한 예가 문제가되었습니다. –

1

내가의 요점을 가지고 생각 명시 적으로 답하라를 defuning없이, 대한 ...

(defun sum (term a next b) 
    (if (> a b) 
     0 
     (+ (funcall term a) (sum term (funcall next a) next b)))) 

(defun ident (x) x) 

(defun sum-int (a b) 
    (sum #'ident a #'1+ b)) 

이상의 CLish보고 있었다 :

(defun sum-int (a b) 
    (sum (lambda (x) x) a #'1+ b)) 

CL에는 함수 (defun으로 정의)와 변수에 대한 별도의 네임 스페이스가 있으므로 함수 객체를 가져 오려면 # '따옴표가 필요합니다.

+1

또한 CL에는 전역 함수 네임 스페이스가 있으므로 원래의 ident-in-sumint가 모든 실행에 대해 경고를 발생시킵니다. sum-int를 실행 했으므로 sum-int에서 추출했습니다. – ivans

+1

실제로, 당신이 일종의 무의미 함을 보여주기 위해 단순히 식별자를 무시합니다. 좀 더 CLISH 방식으로 다시 쓰겠습니다 ... 단지 jiffy ... – ivans

+1

나는 이것이 funcalls와 # '인용문으로 무엇을 했는가? ( – ivans

관련 문제