매크로 _toupper를 참조하면 컴파일러는 매크로와 해당 매개 변수를 지시문의 대체 목록으로 대체하여 대체 목록의 각 매개 변수 발생에 대한 매크로 참조 인수를 대체합니다. 반면 에이터처는 실제 상수입니다. 스위치 대/소문자 및 배열 크기를 정의하는 데 사용할 수 있습니다. 그러나 이러한 단점은 정수만 정의할 수 있다는 것입니다. 문자열 상수 및 부동 점 상수에 사용할 수 없습니다. 따라서 결국 #define 상수는 코드에서 상수를 만드는 통합된 방법을 원하는 경우에만 유일한 옵션입니다. 결과 코드는 정확하지만 오히려 바보 같아 보입니다. pos-form 및 0-폼을 생략할 때 더 나은 코드를 생성 하기 위해 매크로 정의 다시 작성할 수 있습니다., 또는 하나는 단순히 코드 자체를 개선 하기 위해 충분히 스마트 컴파일러를 제공 하는 공통 Lisp 구현에 의존 수 있습니다. 인수는 기호여야 합니다.
심볼에 매크로 정의인 전역 함수 정의가 있는 경우 확장 함수(두 인수, 매크로 호출 양식 및 환경의 함수)가 반환됩니다. 기호에 전역 함수 정의가 없거나 일반 함수또는 매크로가 아닌 특수 한 형식으로 정의가 있는 경우 nil이 반환됩니다. 함수 매크로 확장은 확장 함수를 호출하는 가장 좋은 방법입니다. 반면에 매크로로 이 작업을 수행하려고 하면 매크로에 정의된 변수가 다른 변수와 동일한 함수에 있기 때문에 컴파일 오류가 발생합니다. 을 참조하십시오. 이 매크로는 다음과 같이 정의됩니다: 인수가 있는 매크로를 만들려면 매크로 이름 다음에 쉼표로 구분된 괄호안에 넣습니다. 자체 수정 매크로를 원한다면 m4와 같은 멋진 매크로 프로세서를 사용해야합니다. X3J13은 1988년 3월(MACRO-FUNCTION-ENVIRONMENT)에 매크로 함수에 선택적 환경 인수를 추가하기로 결정했습니다. 그러나 무언가를 사용하기로 결정했다면 매크로를 정의하기위한 좋은 규칙을 따르십시오.
이러한 종류의 속임수는 주로 디버깅에 사용됩니다. 어설션 매크로는 기본 제공 매크로 __FILE___(현재 소스 파일로 인용된 문자열로 확장) 및 __LINE__(인용되지 않은 현재 소스 줄 번호로 확장)을 사용하여 잘못된 매크로를 인쇄하는 보다 정교한 버전입니다. 표현뿐만 아니라 소스에서 의 위치도 볼 수 있습니다. ## 전처리자 연산자는 다음 예제와 같이 두 개의 토큰을 세 번째 유효한 토큰으로 연결하는 데 사용됩니다: 매크로 참조를 지정할 때 이러한 규칙을 따르십시오: setf는 매크로 함수와 함께 사용하여 기호의 전역 함수 정의로 매크로를 설치할 수 있습니다. : 인터프리터에 의해 양식이 실행되는 경우 심볼 산술 연산의 함수 정의가 발생하며, 이 함수는 대략 2인수 확장 함수와 동일한 매크로가 매크로의 매우 강력한 기능입니다. 이를 사용하여 사용자 고유의 구문을 만들 수 있습니다. defmacro를 사용하여 매크로를 재정의하거나(예: 잘못된 정의의 수정된 버전을 설치하거나) 함수를 매크로로 재정의할 수 있습니다. 특수 양식의 이름을 매크로로 재정의하는 것은 오류입니다(표 5-1 참조). 제한된 어휘 범위에 대해 매크로 정의를 설정하는 매크로렛을 참조하십시오. # 사전 처리자 연산자는 다음에 오는 인수를 문자열 리터럴로 변환하는 데 사용됩니다. 전처리기 연산자 #은 함수와 같은 매크로 정의에서만 사용할 수 있습니다.
예를 들어, 어떤 선택을 하든 상관없습니다. 가장 인기있는 것은 모든 매크로 이름 대문자를 정의하는 것입니다. 그래서 당신은 그 규칙을 따를 수 있습니다. 바라건대, 이제 함수와 매크로 사이에 차이가 있음을 이해합니다.