프로그래밍 언어인 라켓을 어떻게 평가하나요?
라켓의 탄생과 발전
라켓 개발에 대한 간략한 소개는 라켓에 대한 질문에 대한 Zhihu의 답변을 참조하세요. ?
1958년, 인공지능의 아버지인 존 매카시(John McCarthy)는 람다 미적분학을 기반으로 한 기호 처리 언어를 발명했습니다. 1960년에 매카시는 유명한 논문 "Recursive Functions of Symbolic Expressions and their Computation by Machine"을 발표했습니다. LSIP(목록 프로세서)의 구문은 기호 표현식(S-Expression)으로 명명됩니다. ?LISP는 7가지 함수[atom car cdr cond cons eq quote]와 2가지 특수 유형[lambda label]을 기반으로 구축되었습니다.
Lisp는 원래 순수 과학 연구를 위해 탄생했습니다. 코드 실행은 인간의 두뇌가 계산하는 수학 공식과 같습니다. McCarthy의 학생인 Stephen Russell이 IBM 704 시스템에서 평가 기능을 구현한 후에야 컴퓨터 언어로서의 Lisp의 역사가 시작되었습니다. 1962년 최초의 완전한 Lisp 컴파일러가 MIT에서 탄생한 이후 Lisp는 MIT를 중심으로 전 세계로 퍼져 나갔습니다. 그 후 10년 정도에 걸쳐 다양한 Lisp 방언이 등장했습니다.
1975년 스킴(Scheme)이 탄생했다. Scheme도 MIT에서 탄생했습니다. 디자인 철학은 미니멀리즘입니다. 필요한 몇 가지 기본 기능만 제공하고 다른 모든 실용적인 기능은 라이브러리에서 구현됩니다. 미니멀리스트 디자인 컨셉에 따라 Scheme은 매우 우아한 경향이 있으며 교육계에서 컴퓨터 교육 언어로 널리 사용됩니다.
1984년 커먼 리스프가 탄생했다. 1970년대와 1980년대에는 Lisp 방언이 너무 많아 커뮤니티가 분열되어 Lisp의 전반적인 발전에 도움이 되지 않았습니다. 1981년부터 Lisp 해커 그룹의 운영 하에 3년간의 노력 끝에 Common Lisp가 1984년에 출시되었습니다. Scheme의 디자인 컨셉은 다른 Lisp 버전과 다르기 때문에 Common Lisp는 Scheme의 일부 기능을 차용하지만 Scheme을 통합하지는 않습니다. 그 이후로 Lisp의 두 가지 방언인 Common Lisp와 Scheme만 남았습니다.
1990년대 이후 C, Java, C#의 부흥으로 인해 Lisp는 점차 쇠퇴했습니다. 2005년이 되어서야 과학 컴퓨팅의 부상과 동적 언어인 JavaScript, Python, Ruby의 인기로 인해 Lisp가 점차 사람들의 관심을 끌게 되었습니다. 그러나 교육계에서는 Lisp의 전통적인 입장에서 Python이 2008년에 Scheme을 강력한 도전자로 비난하기 시작했고, MIT는 Scheme을 교육 언어로 사용하는 SICP(Construction and Interpretation of Computer Programs) 과정을 포기했습니다. 기초 교육을 위한 Python. 동시에 미국 노스이스턴대학교는 별도의 난로를 설립했고, 이를 대표하는 과학 컴퓨팅 시스템인 PLT Scheme이 2010년부터 급속히 발전하기 시작했고, PLT Scheme은 Racket으로 이름이 바뀌었습니다. 최근 몇 년 동안 The Racket Language는 Haskell 웹사이트와 함께 올해 가장 활발한 언어 웹사이트가 되었습니다. ?
기호 표현식 S-Expression
먼저 S-표현식에 대해 이야기해 보겠습니다. S-표현식의 기본 요소는 목록과 원자?입니다. 목록은 괄호로 둘러싸여 있으며 공백으로 구분된 요소를 원하는 만큼 포함할 수 있습니다. 원자는 다른 요소입니다. ?접두사 표기법을 사용하며 Lisp에서 코드와 데이터로 모두 사용됩니다.
?예: 1 2*3 ?접두사로 쓰는 표현은 ?( 1 (* 2 3)) 입니다.
장점: 파싱이 쉽고 단순하고 순수하며 우선순위 등을 고려할 필요가 없으며 이는 코드를 데이터로 구현하기 위한 전제조건이기도 합니다.
단점: 가독성이 좋지 않습니다.
고차 함수
고차 함수는 다음 조건 중 하나 이상을 충족합니다.
하나 이상의 함수를 입력으로 허용합니까?
함수를 출력합니다.
이것의 예는 하나의 함수를 다른 함수에 매핑하는 미적분학의 파생물입니다. ?유형이 지정되지 않은 람다 미적분학에서는 모든 함수가 고차입니다. 함수형 프로그래밍에서는 다른 함수를 반환하는 고차 함수를 커리 함수라고 합니다. ?커링은 여러 개의 매개변수를 받는 함수를 단일 매개변수(원래 함수의 첫 번째 매개변수)를 받는 함수로 변환하고, 나머지 매개변수를 받아 결과를 반환하는 새로운 함수를 반환하는 기술이다. 예를 들어, f(x, y)=x y, y=1이 주어지면 함수 g(x)=x 1이 얻어집니다.
람다 표현식
람다 표현식은 Racket에서 익명 함수를 정의하는 데 사용됩니다. "프로그램 설계 방법" 책에 나와 있는 사용 원칙은 다음과 같습니다. 매개변수로 한 번 사용해야 합니다. 람다 표현식을 사용하시겠습니까? 재귀를 표현하기 위해 람다 표현식을 사용하려면 "Y 결합자"를 도입해야 합니다. Y는 함수 F(함수를 매개변수로 허용)에 대해 작동할 때 함수 X를 반환합니다. . 그런 다음 이 함수 X에 F를 적용하면 여전히 X를 얻습니다. 따라서 X를 F의 고정점, 즉 (Y F) = (F (Y F)) 라고 합니다.
게으른 평가
게으른 평가(Lazy Evaluation), 직설적으로 말하면 일부 중간 결과를 계산할 필요가 없으며 이를 찾는 것은 후속 계산에 도움이 되지 않습니다. . 시간. 참조: ?지연 평가 및 게으른 프로그래밍?. ?
지연 평가는 컴퓨터 프로그래밍의 개념으로, 그 목적은 컴퓨터가 수행하는 작업을 최소화하는 것입니다. 지연 평가의 가장 중요한 이점은 데이터 유형을 무제한으로 구성할 수 있다는 것입니다. 지연 평가를 사용하는 경우 표현식은 변수에 바인딩된 직후 평가되지 않지만 값이 검색될 때 평가됩니다. x:=expression;(표현식 결과를 변수에 할당)과 같은 문은 명시적으로 표현식을 호출하고 결과를 계산하여 배치합니다. 표현식에 x에 대한 참조가 있고 해당 값이 필요한 경우 후속 표현 자체도 지연될 수 있으며, 최종적으로 외부 세계가 볼 수 있는 특정 기호를 생성하기 위해 빠르게 증가하는 값이 계산됩니다. ?
클로저
클로저 컴퓨터 과학에서 ?클로저(Closure)는 렉시컬 클로저(Lexical Closure)의 약어로, 자유 변수를 참조하는 함수인?. 자유 변수는 표현식에서 위치를 나타내는 데 사용되는 기호입니다. 예를 들어 f(x, y)가 x의 편도함수를 취하는 경우 y는 자유 변수입니다. 참조된 자유 변수는 그것이 생성된 환경을 떠난 후에도 함수에 남아 있습니다. 함수 내에서 다른 함수를 정의할 때(중첩) 내부 함수가 외부 함수의 변수를 참조하면 클로저가 발생할 수 있습니다. 런타임 시 외부 함수가 실행되면 내부 함수의 코드와 필요한 외부 함수의 변수에 대한 참조를 포함하는 클로저가 형성됩니다. 참조되는 변수를 upvalue라고 합니다. 인터넷에는 JavaScript 클로저에 관한 많은 기사가 있습니다. LISP에 대한 체계적인 이해가 있다면 이 개념은 자연스럽게 명확해질 것입니다.
빠른 정렬의 라켓 구현 #lang?racket
(define?(quick-sort?array) (cond
[(empty?array)?empty ];?빠른 정렬의 개념은 재귀를 나누어 정복하는 것입니다.
[else?(append?
(quick-sort?(filter?(lambda?(x)? (lt;? x?(first?array)))?array));?array? 여기서는 종료됩니다
(filter?(lambda?(x)?(=?x?(first?array) ) ))?배열)
(빠른 정렬?(filter?(lambda?(x)?(gt;?x?(first?array)))?array))])) p>
(빠른 정렬?'(1?3?2?5?3?4?5?0?9?82?4))
;;?실행 결과?'( 0?1?2?3?3?4?4?5?5?9?82)
이 예를 통해 람다 연산자를 활용한 Racket 언어의 강력한 표현력을 느낄 수 있습니다. 고차 함수, 람다 표현식 및 클로저의 경우 Racket이 설명한 빠른 정렬을 통해 매우 정교해졌습니다. 이는 von Neumann 모델을 기반으로 한 C 언어와 완전히 다른 사고 모드입니다. 나중에 Racket에 대해 더 많이 알게 되면 통역사를 작성해 보세요.