TypeScript
AST modeli
Bir mini AST modelini discriminated union'larla tasarlarsın.
AST modeli
AST (Abstract Syntax Tree), bir programın yapısını temsil eden ağaçtır. discriminated union'larla her düğüm türü kind discriminant alanıyla modellenir; her tür kendi alanlarını taşır. Bu, derleyici yazarken tür güvenli dallanmayı sağlar.
type Node =
| { kind: "number"; value: number }
| { kind: "string"; value: string }
| { kind: "add"; left: Node; right: Node };
Discriminant ile dallanma
kind discriminant alanı, switch ifadesiyle dallanmayı sağlar. Her case, ilgili düğümün kendi alanlarına daraltır; örneğin case "number" dalında node.value number olarak erişilir. Bu, derleme zamanında yanlış erişimi önler.
function label(n: Node): string {
switch (n.kind) {
case "number": return "number: " + n.value;
case "string": return "string: " + n.value;
case "add": return "add";
}
}
Uygulama AST Node türünü tanımla
Node discriminated union türünü tanımla: "number" (value: number), "string" (value: string), "add" (left: Node, right: Node) üyeleri, kind discriminant alanıyla. kindOf(n: Node): string fonksiyonunu switch ile yaz: number için "n", string için "s", add için "a" döndür. console.log(kindOf({ kind: "number", value: 42 })) ile sonucu yazdır.
Örnek çözümü göster
type Node =
| { kind: "number"; value: number }
| { kind: "string"; value: string }
| { kind: "add"; left: Node; right: Node };
function kindOf(n: Node): string {
switch (n.kind) {
case "number":
return "n";
case "string":
return "s";
case "add":
return "a";
}
}
console.log(kindOf({ kind: "number", value: 42 }));
Kendini test et
-
AST düğümlerini discriminated union ile modellemenin avantajı nedir?
- Çalışma zamanı hızını artırır
- Düğüm sayısını azaltır
- Kodu daha kısa yapar
- Tür güvenli dallanma sağlar
Cevabı göster
Tür güvenli dallanma sağlar — Discriminated union, her düğümün kind alanına göre switch ile güvenli daraltma yapılmasını sağlar; yanlış erişim derleme zamanında yakalanır.
-
AST düğüm discriminant
type Node =
| { kind: "number"; value: number }
| { kind: ____; value: string }
| { kind: "add"; left: Node; right: Node };
Cevabı göster
type Node =
| { kind: "number"; value: number }
| { kind: "string"; value: string }
| { kind: "add"; left: Node; right: Node };
-
AST modeli parçaları
- kind discriminant
- düğüm türünü belirtir
- Node union
- tüm düğüm türlerini birleştirir
- discriminated union
- tür güvenli dallanma
- value, left, right
- düğüme özgü alanlar
Sıradaki ders: Visitor tasarımı