来るべき Swift Macro に備えて Swift の構文木について学びましょう。この発表の前半では Swift Macro を定義する際に理解が必要な「構文木」とは何かを初心者向けに説明します。 https://dena.connpass.com/event/291447/
4XJGU.BDSPʹඋ͑ͯ ߏจΛNJOͰֶͿKuniwak - DeNA Co.,Ltd. 2023.08.24 SwiftWednesday
View Slide
"CPVUNF
,VOJXBLw ॴଐˠw 4XJGU4ZOTUBYʹ DPOUSJCVUFͨ͜͠ͱ͋Δw ࠷ۙJ04ΞϓϦॻ͍ͯͳ͍w "QQ$PEF͍͍ͧʢྦʣ3
ؒͰ͍͑ͨ͜ͱ
ߏจͱίʔυΛѻ͍͍͢ σʔλมͨ͠ͷͰ͋Δߏจා͘ͳ͍ՄѪ͍Α5
4XJGU.BDSPͱ
4XJGUʹ.BDSP͕͖ͬͯͨ4XJGU͔Β͑Δ7
8͑Δ.BDSP࣍ͷͭɿw 'SFFTUBOEJOH.BDSPw "UUBDIFE.BDSP
9@OptionSetstruct Permissions {private enum Perm: Int {case readcase writecase execute }}struct Permissions {private enum Perm: Int {case readcase writecase execute }static let read: Self = Self(rawValue: 1 << Perm.rea static let write: Self = Self(rawValue: 1 << Perm.wri static let execute: Self = Self(rawValue: 1 << Perm.exe}"UUBDIFE.BDSPͷྫAttached macroల։
͍ͣΕʹڞ௨͢Δͷߏจ͔Β ߏจͷมͰ͋Δͱ͍͏͜ͱ10ʁ ʁߏจ ߏจϚΫϩల։
ߏจ͕Կ͔ΛΒͳ͍ͱ࡞Εͳ͍11ʁ ʁߏจ ߏจϚΫϩల։
ߏจͱԿ͔
if let self = self {}13આ໌ʹ͏αϯϓϧίʔυ
if let self = self {}JGจ14͜ΕʮJGจʯͱݺΕΔ
if let self = self {}if let self = self {}JGจෳจ݅15JGจʮ݅ʯͱʮෳจʯͰ ߏ͞Ε͍ͯΔ
if let self = self {}if let self = self {}JGจෳจ0QUJPOଋറ݅16ࠓճͷ݅෦ʹɺ ʮ0QUJPOଋറ݅ʯͱ ݺΕ͍ͯΔͷ͕ೖΔ
if let self = self {}if let self = self {}JGจෳจ0QUJPOଋറ݅มࣜมύλʔϯif let self = self {}170QUJPOଋറ݅ɺೖઌͷ ʮมύλʔϯʯͱೖ͢Δͷ ʮมࣜʯͰߏ͞Ε͍ͯΔ
if let self = self {}if let self = self {}if let self = self {}18͜ͷΑ͏ʹɺίʔυΛղͯ͠ ߏཁૉΛḷ͍ͬͯ͘ͱɺ ίʔυΛʮߏʯͱͯ͠ ѻ͍ͬͯΔ͜ͱʹؾͮ͘
19ෳจJGจෳจมύλʔϯ มࣜ0QUJPOଋറ݅if let self = self {}if let self = self {}if let self = self {}
20ෳจJGจෳจมύλʔϯ มࣜ0QUJPOଋറ݅͜ΕΛʮߏจʯͱΑͿif let self = self {}if let self = self {}if let self = self {}
4XJGU.BDSPͷதͰߏจ͕Ͳ͏ಇ͔͘
22TUSVDUએݴ1FSNJTTJPOTFOVNએݴ1FSN$BTFએݴ $BTFએݴ $BTFએݴSFBE XSJUF FYFDVUFղੳ@OptionSetstruct Permissions {private enum Perm: Int {case readcase writecase execute }}
23TUSVDUએݴ1FSNJTTJPOTFOVNએݴ1FSN$BTFએݴ $BTFએݴ $BTFએݴSFBE XSJUF FYFDVUFTUSVDUએݴ1FSNJTTJPOTFOVNએݴ1FSN$BTFએݴ $BTFએݴ $BTFએݴSFBE XSJUF FYFDVUFมએݴॳظԽઅSFBEมએݴॳظԽઅXSJUมએݴॳظԽઅFYFDՃมܗੳ
struct Permissions {private enum Perm: Int {case readcase writecase execute }static let read: Self = Self(rawValue: 1 << Perm.rea static let write: Self = Self(rawValue: 1 << Perm.wri static let execute: Self = Self(rawValue: 1 << Perm.exe}24TUSVDUએݴ1FSNJTTJPOTFOVNએݴ1FSN$BTFએݴ $BTFએݴ $BTFએݴSFBE XSJUF FYFDVUFมએݴॳظԽઅSFBEมએݴॳظԽઅXSJUมએݴॳظԽઅFYFDՃՃίʔυͱͯ͠ ݟΔͱมܗ
ߏจΛͲ͏ͬͯ ֬ೝͰ͖Δ͔
4XJGU"45&YQMPSFSΛ͏ͷָ͕26
27https://swift-ast-explorer.com/
ߏจԿʹ͑Δͷ͔
ߏจ.BDSPҎ֎ʹ ͞·͟·ͳ͜ͱʹར༻Ͱ͖Δ29
w ੩తղੳʢ-JOUʣw ϑΥʔϚολw ίʔυੜw FUD30
͜ͷઈͷػձʹߏจΛ ֮͑ͯ͠·͍·͠ΐ͏31
4XJGUͷߏจΛͬͯ .BDSP͚ͩͰͳ͘ ৭ʑͳ͜ͱʹ׆༻͠Α͏·ͱΊ32