Common Lisp 학습의 세 가지: 변수 사용
2578 단어 구문 변수 동적 변수
1 변수 베이스
Common Lisp는 매우 동적인 언어입니다.변수는 변수가 아닌 임의의 유형의 대상을 가리킬 수 있다.모든 종류의 오류가 검출됩니다.
let은 새로운 변수를 도입할 수 있습니다.
(let (variables* ) body-form*)
let 표현식이 값을 구할 때 모든 변수의 값은 먼저 값을 구하고 바디가 실행되기 전에 귀속됩니다.let 실행이 끝난 후, 이 변수들은 let을 실행하기 전에 인용한 내용을 다시 인용합니다. 만약 있다면.
아래의 쌍순 서열표를 병합하여 정렬한 코드에서let의 사용 방법을 볼 수 있다.
(define (merge list1 list2)
(cond
((empty? list1) list2)
((empty? list2) list1)
(else
(let ((f1 (car list1))
(f2 (car list2)))
(if (< f1 f2)
(cons f1 (merge (cdr list1) list2))
(cons f2 (merge list1 (cdr list2))))))))
let*도 새로운 변수를 도입할 수 있다. let과 차이점은 다음과 같다. let이 만든 변수는 바디에만 나타나고 let*가 만든 변수는variables에서 인용할 수 있다.
함수형 인삼도 귀속을 만들 수 있습니다.함수 인덱스와 Let 변수의 역할 영역은 이 변수를 도입하는 형식 내부, 즉 함수 정의와let 형식 내부로 한정되어 있으며, 이를 귀속 형식이라고 부른다.같은 이름의 변수의 귀속 형식을 삽입하면 내부 변수 귀속은 외부 변수를 덮어씁니다.클래스 C 언어의 국부 변수와 유사한 중첩
2 문법 변수와 클립
기본적으로 CL의 모든 바인딩 형식은 구문 작용역 변수를 가져옵니다.어법 작용역이 삽입 함수와 함께 사용될 때 폐쇄라는 개념이 생겼다.
(let ((count 0))
(lambda ()
(setf count (+ count 1))))
let이 함수를 되돌려주기 때문에, 호출할 때 let의 귀속 형식 내부에 있지 않습니다.이 때 CL은 외부 귀속 형식에서 만든 귀속을 폐쇄하는 폐쇄 대상을 만들 것입니다. (여기는count=0)패킷을 닫으면 닫힌 변수 값에 접근할 수 있을 뿐만 아니라, 매번 변수가 변하는 새로운 값도 저장할 수 있다.패키지를 닫는 귀속은 외부 동명 변수의 영향을 받지 않습니다.
하나의 클립은 변수를 인용하여 여러 변수의 연결을 닫을 수도 있고, 여러 개의 클립이 같은 연결을 포착할 수도 있다.
3 동적 변수
CL은 전역 변수를 만들기 위해 defvar과 defparameter를 제공합니다. 양자의 차이점은 전자가 변수가 정의되었을 때 원래의 값을 수정하지 않는다는 것입니다.
전역 변수를 정의한 후, 어느 곳에서든 인용할 수 있습니다.그 장점은 여기저기 전달할 필요가 없다는 데 있다.
때때로 우리는 사용할 때 함수 중의 어떤 변수의 값을 임시로 바꾸어 서로 다른 기능을 실현하기를 희망한다.폐쇄된 귀속은 다시 귀속을 지원하지 않기 때문에 동적 변수를 도입하여 이 목적을 달성한다.예를 들면 다음과 같습니다.
(let ((*stdout* some-other)) (body))
바디의 코드가 stdout을 인용할 때 모두 let이 만든 귀속을 인용하고 바디가 let을 떠날 때 stdout의 귀속은 사라집니다.즉 바디에서 stdout의 귀속을 동적으로 찾습니다. 현재 이름 공간에 이 귀속이 존재하지 않으면 위층으로 돌아가 찾습니다.CL에서 동적 변수는 special을 사용하여 성명해야 하며, 전역 변수는 기본적으로 special로 성명해야 합니다.
4 상수
상수는 전역적입니다. defconstant으로 정의할 수 있으며, 전역 상수의 끝은 +로 끝납니다.
5 할당
기본 문법: (setf place value) place가 변수일 때value를place에 연결합니다.
또한 CL은 사용자 정의 데이터 구조를 지원하여 구조의 임의의 위치에 값을 부여할 수 있습니다.
한 번에 여러 설정 지원: (setf x 1 y 2)
마지막으로 부여된 값을 되돌려줍니다.
6 위치별로 수정
(incr x n)n 기본값은 1입니다.
(decr x n)
(rotatef x y) 교환 x, y 값
(shiftf x y z) 첫 번째 값을 반환하고 다음 값을 한 자리 앞으로 이동합니다.