TypeScript
Birleştirme
Tüm parçaları birleştirerek çalışan derleyiciyi yazarsın.
Birleştirme
Tür güvenli derleyici, AST modeli, visitor deseni, type guard'lar ve exhaustive eval fonksiyonunun birleşimidir. AST düğümleri discriminated union ile modellenir; visitor deseni dolaşmayı sağlar; type guard'lar dış kodun daraltmasını kolaylaştırır; exhaustive eval tüm türleri güvenli işler.
type Node =
| { kind: "number"; value: number }
| { kind: "string"; value: string }
| { kind: "add"; left: Node; right: Node };
function assertNever(x: never): never {
throw new Error("Unexpected");
}
function evalNode(n: Node): string {
switch (n.kind) {
case "number": return String(n.value);
case "string": return n.value;
case "add": return evalNode(n.left) + evalNode(n.right);
default: return assertNever(n);
}
}
Tam derleyici
Tam bir derleyici, AST modelini alır, visitor ile dolaşır, type guard'larla dış daraltma sağlar ve exhaustive eval ile değerlendirir. Yeni düğüm eklendiğinde tüm parçalar güncellenmelidir; assertNever bunu garanti eder.
const ast: Node = {
kind: "add",
left: { kind: "number", value: 2 },
right: { kind: "string", value: "x" }
};
console.log(evalNode(ast)); // "2x"
Uygulama Tam derleyici yaz
assertNever(x: never): never fonksiyonunu tanımla (throw new Error("Unexpected") ile). Node discriminated union türünü tanımla ("number" (value: number), "string" (value: string), "add" (left: Node, right: Node)). evalNode(n: Node): string fonksiyonunu switch (n.kind) ile yaz: number için String(n.value), string için n.value, add için evalNode(n.left) + evalNode(n.right), default için return assertNever(n);. ast adında bir Node değeri tanımla: { kind: "add", left: { kind: "number", value: 2 }, right: { kind: "string", value: "x" } }. console.log(evalNode(ast)) ile sonucu yazdır.
Örnek çözümü göster
function assertNever(x: never): never {
throw new Error("Unexpected");
}
type Node =
| { kind: "number"; value: number }
| { kind: "string"; value: string }
| { kind: "add"; left: Node; right: Node };
function evalNode(n: Node): string {
switch (n.kind) {
case "number":
return String(n.value);
case "string":
return n.value;
case "add":
return evalNode(n.left) + evalNode(n.right);
default:
return assertNever(n);
}
}
const ast: Node = {
kind: "add",
left: { kind: "number", value: 2 },
right: { kind: "string", value: "x" }
};
console.log(evalNode(ast));
Kendini test et
-
Tür güvenli derleyicide hangi desenler birlikte kullanılır?
- Yalnızca sınıflar
- Yalnızca fonksiyonlar
- Yalnızca interface'ler
- Discriminated union, visitor, type guard, exhaustive check
Cevabı göster
Discriminated union, visitor, type guard, exhaustive check — Tür güvenli derleyici, AST modeli için discriminated union, dolaşma için visitor, daraltma için type guard ve güvenli değerlendirme için exhaustive check bir arada kullanır.
-
add düğümü tanımı
type Node =
| { kind: "number"; value: number }
| { kind: "string"; value: string }
| { kind: ____; left: Node; right: Node };
Cevabı göster
type Node =
| { kind: "number"; value: number }
| { kind: "string"; value: string }
| { kind: "add"; left: Node; right: Node };
-
Birleştirme parçaları
- AST modeli
- discriminated union ile
- Visitor deseni
- ağacı dolaşır
- Type guard'lar
- dış daraltma sağlar
- Exhaustive eval
- tüm türleri güvenli işler
Sıradaki ders: Meydan okuma 1: Tür matematiği