Lisp 매크로의 일반적인 응용 프로그램은 무엇입니까?


19

LISP를 배우려고 노력하고 있으며 LISP 매크로의 중요성에 대해 많이 읽었으므로 작업 경험을 얻고 싶습니다.

매크로를 사용하여 실제 문제를 해결하고이 프로그래밍 구성의 유용성을 이해할 수있는 실용적인 응용 분야를 제안 할 수 있습니까?

노트

이것은 다음 질문에서 수행해야 할 일반적인 프로젝트 가 아닙니다 . LISP 매크로를 통해 일반적으로 어떤 종류의 문제가 해결되는지 이해하고 싶습니다. 예를 들어 추상 데이터 유형을 구현하는 데 적합합니까? 이 구조가 왜 언어에 추가 되었습니까? 간단한 기능으로는 해결할 수없는 문제는 무엇입니까?


답변:


9

리스프 매크로는 몇 가지 고유 한 속성을 결합합니다.

  1. 매크로는 새로운 구문을 정의합니다 ↔ 소스 코드를 입력으로 사용합니다
  2. 매크로는 일반적으로 컴파일 타임에 실행됩니다
  3. 매크로는 소스 코드를 생성합니다

최고의 응용 프로그램은 이러한 모든 측면을 활용합니다. 아마도 가장 잘 알려진 예는 Common Lisp 의 (loop…) 일 것입니다. 이러한 기능 중 하나가 없으면 유용성에 가깝지 않습니다. 소스를 입력으로 사용하지 않으면 루프 내부의 동작을 정의하기가 어려울 것입니다. 컴파일 타임 확장이 없으면 너무 느려집니다. 코드 생성 없이는 실행되지 않습니다.

또 다른 좋은 예는 Practical Common Lisp실용 : 이진 파일 구문 분석 의 이진 직렬화 장입니다 .

LINQ와 비슷한 것을 구현하는 쿼리 매크로는 또 다른 좋은 응용 프로그램 일 수 있습니다. 그러나 LINQ를 그대로 만드는 자동 완성 기능이 없습니다. XML 입력 (예 : XAML)이있는 특수 목적 코드 생성기로 오늘날 해결되는 거의 모든 내용도 Lisp 매크로를 사용하여 구현할 수 있습니다.


방금 "Practical Common Lisp"책을 구입했습니다. 제안한 예를 살펴 보겠습니다.
Giorgio

2

일반적인 lisp의 매크로에 대해 생각하고 싶은 방법은 평가 할 코드를 반환하는 함수이지만 해당 코드를 반환하기 전에 인수를 '평가하지 마십시오'라는 것입니다. 함수도 무언가를 반환하지만 본문을 평가하기 전에 각 인수를 평가합니다. 매크로는 그렇지 않습니다.

'On Lisp'의 Paul Graham은 매크로와 함수의 차이점에 대한 가장 좋은 설명 중 하나 (IMHO)를 제공하며 그 중복과 고유성에 대해 설명합니다. 많은 코드 비트를 함수 또는 매크로로 작성할 수 있지만 매크로 만 작동하는 경우가 있습니다. 이것에 머리를 감 으면 매크로의 요점을 잘 알고 있다고 생각합니다.

함수가 작동하지 않는 매크로의 예로 'aif'(aphoric if)를 확인하십시오. 그것은 단지 몇 줄의 코드이며 어디서부터 시작 해야할지에 대한 권장 사항입니다.

의도적 인 변수 캡처를 활용하는 Common Lisp의 아나 포릭 버전을 참조하십시오. Scheme의 자동 위생 버전은 IMO가 '실제 거래'가 아닙니다. 변수 캡처는 lisp macrology의 중요한 부분이며,보다 강력하고 유용한 매크로 중 일부는 확실히 그것을 활용합니다.

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