구성표에서 무엇을 배워야합니까?


10

더 나은 프로그래머가되는 데 도움이되는 Scheme에서 배울 수있는 고유 한 기능이 무엇인지 궁금했습니다.

나는 주류 언어에 대한 많은 경험을 가지고 있으며, 내 지평을 넓히고 다른 언어에서 빠진 기능적 측면에 대해 배우려고합니다. Javascript의 클로저, C #의 람다 식에 익숙하며 다른 언어로는 부족한 점에 궁금합니다. Lisp 구문을 제외하고는 지금까지 다른 언어에서 이미 본 것과 같은 느낌이 듭니다.

새로운 것을 가르쳐 줄 Scheme / Lisp의 고유 한 특징은 무엇입니까?


3
Lisp는 당신이 그것을 마침내 얻을 때 얻게 될 심오한 깨달음 경험을 위해 배울 가치가 있습니다. 실제로 Lisp 자체를 많이 사용하지 않더라도 그 경험을 통해 남은 하루 동안 더 나은 프로그래머가 될 것입니다. -Eric Raymond
Robert Harvey


1
@Robert Harvery : 또한 : xkcd.com/224
Poindexter

2
현재의 형태 에서이 질문은 특히 건설적이지 않습니다. 보다 구체적인 정보를 요청하기 위해 재 작업 할 수 있다면 유용 할 것입니다.
ChrisF

참고 포스트 - 린네 시대의 프로그래밍 언어 교육 및 교과서가이 논문의 참고 문헌 : 응용 프로그램 및 해석 : 언어 프로그래밍 의 사용 라켓 언어 , 제도의 방언을.
Robert Harvey

답변:


7

아마도 Lisp의 가장 중요한 정의 특성은 "데이터 코드"입니다.  다른 언어와 같은 방식으로 그 경험을 얻지 못할 것입니다. C #에서 가장 가까운 아날로그는 식 트리입니다.

Lisp를 구문 분석에 탁월한 언어로 만드는 것이 바로 그 품질입니다. 폴 그레이엄이 리스프에 대해 말한 동기는 "리프의 특이한 점은 사실 리스프의 품질을 정의하는 것 자체가 직접 작성 될 수 있다는 것"입니다. 자체 호스팅 컴파일러는 새로운 것이 아니지만 Lisp만큼 우아하게 언어를 사용하는 언어는 없습니다.

메타 프로그래밍 (Lisp도 우수함)도 배울 가치가 있습니다.

폴 그레이엄 (Paul Graham)의 평균을 이겼다
http://www.paulgraham.com/avg.html


1
"아하!" ESR이 약속 한 순간, 나는 이미 Prolog에서 "데이터 코드"계시를 받았다는 것이 었습니다.
Frank Shearar

1
Haskell은 "code as data"속성을 가지고 있습니까? 아니면 아름다움은 역동적 인 타이핑과 반사에 크게 의존합니까?
Joey Adams

1
@Joey : 템플릿 Haskell이 있다는 사실은 Haskell에 "code as data"속성이 없다는 것을 의미합니다.
j_random_hacker

4

예, 재귀적인 방식으로 생각하는 데 도움이됩니다. 나는 프로그래밍 언어 수업에서 한 달 정도만 (체계)를 연구했으며 프로그래밍 문제를 생각하고 해결하는 방법을 발전시키는 데 도움이되었습니다.

다른 프로그래밍 패러다임을 시도하는 것이 항상 중요합니다. 그런 다음 새로운 아이디어로 OO 세계로 새롭게 돌아갑니다.

구문이 아니라 추론, 그것은 훌륭한 두뇌 운동입니다. 재귀와 재미있는 목록의 사용으로 인한 IMHO는 많지 않지만 그만한 가치가 있습니다.


체계에 고유하지 않습니다. 모든 (잘, 거의 모든) 기능 언어는 재귀 운동에 좋습니다.

동의하지만 OP는 '주류'언어와 비교하여 체계에 관심이있는 것 같습니다 ....
Xavier Nodet

1

계속 :

컴퓨터 과학 및 프로그래밍에서 연속은 컴퓨터 프로그램의 제어 상태를 추상적으로 표현한 것입니다. 연속은 프로그램 제어 상태를 유지한다. 즉, 연속은 프로세스 실행의 주어진 시점에서 계산 프로세스를 나타내는 데이터 구조이다; 작성된 데이터 구조는 런타임 환경에 숨겨지지 않고 프로그래밍 언어로 액세스 할 수 있습니다. 여기에는 프로세스의 현재 스택 (예 : 수명이 프로세스 내에있는 모든 데이터 (예 : "로컬 변수") 포함) 및 계산의 프로세스 포인트와 같은 정보가 포함됩니다. 연속 인스턴스는 나중에 제어 구조로 사용될 수 있습니다. 호출되면, 제어 포인트가 나타내는 제어점에서 실행을 재개합니다. "현재 연속"

그런 다음 McCarthy의 모호한 연산자 를 구현하십시오 .

1963 년 Lisp의 발명가 인 John McCarthy는 수학 계산의 이론적 근거에 대한 논문 A를 출판했다. 아이디어는 amb (x, y)가 먼저 x와 같다는 것입니다. 그러나 나중에 계산에서 이것이 일종의 모순을 초래하는 것으로 밝혀지면 x의 값이 철회되고 y로 대체됩니다. 이것은 처음보다 훨씬 복잡한 사업입니다. 값을 철회한다는 것은 기본적으로 계산의 전체 상태를 amb가 값 x를 반환했을 때의 위치로 되 감은 다음 y의 값으로 미끄러지는 것을 의미합니다. 이것은 x가 처음 반환되었을 때 어떻게 든 전체 상태를 동결하고 복사한다는 의미입니다. 모순이 발견되면 프로그램의 전체 상태가 삭제되고 다시 활성화 된 고정 버전으로 대체됩니다. 이 고정 상태를 연속이라고합니다. 여러면에서 그것은 산에 대한 GOTO 진술과 같습니다. 코드에서 임의의 지점으로 점프 할 수 있습니다. 그러나 논리적 인 추론에 더 적합하기 때문에 연속은 GOTO보다 좋습니다.


1

나는 다음을 생각할 수 있습니다.

  • 실제 매크로 (언어를 최대한 활용하여 코드 생성)
  • 동질성 (데이터는 코드, 코드는 데이터)
  • 게으른 평가
  • 계속

또한 리스프 언어는 DSL (Domain Specific Language)을 정의하기에 훌륭해야한다고 생각합니다. 그것은 당신이 그것에 대해 이미 모른다면 읽고 싶을 수도 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.