내가 계획하고 일반적으로 리스프에 새로운 해요, 학습에 내가 바인딩 로컬 프로 시저에 사용되는 암호 같은 구문을 우연히 발견했습니다 : 그것은 있음을 파악 걸 렸어요로컬 프로 시저 바인딩
(define mock
(lambda (s)
;; this is what I don't understand
(let splice ([l '()] [m (car s)] [r (cdr s)])
(append
(map (lambda (x) (cons m x)) r)
(if (null? r) '()
(splice (cons m l) (car r) (cdr r)))))))
splice
3 개 요소가있는 범위가 지정된 절차입니다.
(define mock2
(lambda (s)
;; define `splice` first
(define splice
(lambda (la lb lc)
(append
(map (lambda (x) (cons lb x)) lc)
(if (null? lc) '()
(splice (cons lb la) (car lc) (cdr lc))))))
;; bind `splice` and its arguments together and call it with them
(let ([sp splice] [l '()] [m (car s)] [r (cdr s)])
(splice l m r))))
두 번째 버전은 조금 더하고 좀 더 필수적 보이지만, 병렬에 바인딩하기 전에 범위 내 정상적인 절차로 splice
정의 : ML - 억양 스타일이 다시 쓰기는 유사한 출력을 생성하는 것 논쟁과 함께 (또는 그대로있는 척하십시오) 부름을 청합니다.
질문이 두 버전을 교체 할 수 있습니까? 그렇다면 splice
바인딩 양식 내에서 로컬 변수 (l
, m
및 r
)를 바인딩하는 첫 번째 버전의 구문을 설명하는 데 도움이 될 수 있습니까?
'(null? r)'에 이르렀을 때 L을 돌려 보내면 안됩니다 : 달리 사용되지 않는 것 같습니다. – coredump
@coredump 네 말이 맞아. – PieOhPah