Blok Coba Transaksional di ValueScript
Pengecualian sulit dilakukan dengan benar. Masalah yang sangat rumit yang mudah diabaikan adalah kemungkinan evaluasi parsial di dalam tryblok.
Pertimbangkan program JavaScript berikut:
let a = new SmallQueue(["item1"]);
let b = new SmallQueue(["item2", "item3", "item4"]);
try {
const item = a.pop();
b.push(item);
} catch (e) {
console.error("Failed to move item from a to b", e);
}
console.log({ a, b });
{
a: [],
b: ["item2", "item3", "item4", "item1"],
}
{
a: [],
b: ["item2", "item3", "item4"],
}
let a = new SmallQueue(["item1"]);
let b = new SmallQueue(["item2", "item3", "item4"]);
try {
if (b.isFull()) {
throw new Error("b is full");
}
const item = a.pop();
b.push(item);
} catch (e) {
console.error("Failed to move item from a to b", e);
}
console.log({ a, b });
Opsi lain adalah menyimpan salinan variabel yang mungkin berubah dan memulihkannya di catch:
let a = new SmallQueue(["item1"]);
let b = new SmallQueue(["item2", "item3", "item4"]);
const aCopy = a.copy();
const bCopy = b.copy();
try {
const item = a.pop();
b.push(item);
} catch (e) {
a = aCopy;
b = bCopy;
console.error("Failed to move item from a to b", e);
}
console.log({ a, b });
- Anda mungkin tidak melakukannya karena itu bertele-tele dan terasa defensif yang tidak perlu
- Ini membutuhkan
copyoperasi untuk didefinisikan - Jika
copyoperasi itu ada, itu mungkin tidak efisien - Jika
a.popmemiliki efek samping, efek samping tersebut tidak akan dikembalikan
let a = new SmallQueue(["item1"]);
let b = new SmallQueue(["item2", "item3", "item4"]);
let item;
try {
item = a.pop();
} catch (e) {
console.error("Failed to move item from a to b", e);
console.log({ a, b });
return;
}
try {
b.push(item);
} catch (e) {
a.unPop(item);
console.error("Failed to move item from a to b", e);
}
console.log({ a, b });
- Sangat bertele-tele
a.unPop(item)mengharuskan kita untuk memahami bahwa operasi ini diperlukan saatb.push(item)gagal, yang masih mudah terlewatkan
Di ValueScript, tryblok bersifat transaksional — blok berjalan hingga selesai atau dikembalikan.
Program asli kami melakukan apa yang kami inginkan tanpa modifikasi apa pun:
let a = new SmallQueue(["item1"]);
let b = new SmallQueue(["item2", "item3", "item4"]);
try {
const item = a.pop();
b.push(item);
} catch (e) {
console.error("Failed to move item from a to b", e);
}
console.log({ a, b });
{
a: ["item1"],
b: ["item2", "item3", "item4"],
}
- “Anda mungkin tidak melakukannya”
— Kompiler ValueScript menyisipkan instruksi secara otomatis - “Membutuhkan
copyoperasi”
— ValueScript menggunakan nilai semantik, hanya menggunakanaCopy = a, dan ini setara dengan penyalinan - "
copymungkin tidak efisien"
— ValueScript menggunakan copy-on-write sepenuhnya, ini cukup efisien - “Efek samping
a.poptidak akan dikembalikan”
— ValueScript tidak memiliki efek samping
* beberapa fungsi asing yang luar biasa mungkin termasuk operasi pengembalian dan ini akan dipanggil secara otomatis
ValueScript adalah dialek TypeScript dengan semantik nilai. Ini memiliki taman bermain online termasuk demonstrasi program artikel ini , dan open source .

![Apa itu Linked List? [Bagian 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































