<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Macros on Kelly Dev</title><link>https://kelly-chui.github.io/tags/macros/</link><description>Recent content in Macros on Kelly Dev</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Fri, 15 Aug 2025 00:00:00 +0000</lastBuildDate><atom:link href="https://kelly-chui.github.io/tags/macros/index.xml" rel="self" type="application/rss+xml"/><item><title>The Swift Programming Language. Macro (1)</title><link>https://kelly-chui.github.io/posts/the-swift-programming-language-32-macro-1/</link><pubDate>Thu, 14 Aug 2025 00:00:00 +0000</pubDate><guid>https://kelly-chui.github.io/posts/the-swift-programming-language-32-macro-1/</guid><description>&lt;figure class="theme-image"&gt;
&lt;img
class="theme-image__image theme-image__image--light"
src="https://kelly-chui.github.io/images/assets/swift-logo-light.svg"
alt="Swift logo"
loading="lazy"
decoding="async"
&gt;
&lt;img
class="theme-image__image theme-image__image--dark"
src="https://kelly-chui.github.io/images/assets/swift-logo-dark.svg"
alt="Swift logo"
loading="lazy"
decoding="async"
&gt;
&lt;/figure&gt;
&lt;p&gt;매크로는 컴파일할 때 소스 코드를 변환하여, 반복적인 코드를 직접 작성하지 않게 해준다. 컴파일하는 동안, Swift는 평상시처럼 코드를 빌드하기 전에 매크로들을 확장한다.&lt;/p&gt;
&lt;img loading="lazy" src="https://kelly-chui.github.io/posts/the-swift-programming-language-32-macro-1/image-002-optimized-image.webp"&gt;&lt;p&gt;매크로를 확장하는 것은 항상 추가하는(additive) 작업이다: 매크로는 새로운 코드를 더하지만, 기존에 존재하는 코드를 삭제하거나 수정하지 않는다.&lt;/p&gt;
&lt;p&gt;매크로 입력과, 매크로 확장의 출력 둘 다 구문적으로 유효한 Swift 코드인지 체크된다. 마찬가지로, 매크로에 전달되는 값과 매크로로 생성된 코드 안의 값이 정확한 타입인지 검사된다. 추가적으로, 매크로를 확장할 때 구현부에서 에러를 마주치면, 컴파일러는 이를 컴파일 에러로 처리한다. 이러한 보장은 매크로를 사용하는 코드를 더 쉽게 이해하게 해주고, 매크로를 잘못 사용하거나 매크로의 구현에 버그가 있는 이슈들을 더 쉽게 알아차리게 해준다.&lt;/p&gt;</description></item><item><title>The Swift Programming Language. Macro (2)</title><link>https://kelly-chui.github.io/posts/the-swift-programming-language-33-macro-2/</link><pubDate>Fri, 15 Aug 2025 00:00:00 +0000</pubDate><guid>https://kelly-chui.github.io/posts/the-swift-programming-language-33-macro-2/</guid><description>&lt;figure class="theme-image"&gt;
&lt;img
class="theme-image__image theme-image__image--light"
src="https://kelly-chui.github.io/images/assets/swift-logo-light.svg"
alt="Swift logo"
loading="lazy"
decoding="async"
&gt;
&lt;img
class="theme-image__image theme-image__image--dark"
src="https://kelly-chui.github.io/images/assets/swift-logo-dark.svg"
alt="Swift logo"
loading="lazy"
decoding="async"
&gt;
&lt;/figure&gt;
&lt;h3 id="macro-expansion"&gt;Macro Expansion&lt;/h3&gt;
&lt;p&gt;매크로를 사용한 Swift 코드를 빌드 할 때, 코드를 확장하기 위해 매크로의 구현을 불러오게 된다.&lt;/p&gt;
&lt;img loading="lazy" src="https://kelly-chui.github.io/posts/the-swift-programming-language-33-macro-2/image-002-optimized-image.webp"&gt;&lt;p&gt;구체적으로 Swift는 다음과 같은 방법으로 매크로를 확장한다:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;컴파일러가 코드를 읽어, 구문의 in-memory 표현을 만든다.&lt;/li&gt;
&lt;li&gt;컴파일러가 이 in-memory 표현의 일부를 매크로를 확장시키는 매크로 구현부에 보낸다.&lt;/li&gt;
&lt;li&gt;컴파일러가 매크로 호출을 확장된 형태로 대체한다.&lt;/li&gt;
&lt;li&gt;컴파일러가 확장된 소스 코드를 사용하여 컴파일을 계속 진행한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;구체적인 단계들을 살펴보기 위해, 다음을 생각해보자:&lt;/p&gt;
&lt;div class="code-theme-github"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-swift" data-lang="swift"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;magicNumber&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;#&lt;/span&gt;&lt;span class="n"&gt;fourCharacterCode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;ABCD&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;#fourCharacterCode&lt;/code&gt; 매크로는 4개의 캐릭터로 구성된 문자열을 받아, 그 문자열의 ASCII 값들을 이어 붙인 32비트 언사인드 인티저를 리턴한다. 일부 파일 포맷은 데이터를 식별하기 위해 이런 형태의 인티저를 사용하는데, 컴팩트 하면서도 디버거에서 읽을 수 있기 때문이다. 아래의 Implementing a Macro 섹션에서 이 매크로를 구현하는 방법을 보여준다.&lt;/p&gt;</description></item></channel></rss>