บางคนก็ตอบว่า "ไม่" อย่างถูกต้องพร้อมตัวอย่างภาษา ฉันคิดว่าฉันสามารถขยายได้โดยการเพิ่มตัวอย่างเกี่ยวกับวิธีเพิ่มข้อยกเว้นให้กับภาษาโดยไม่เกี่ยวข้องกับ OOP
ฉันจะทำสิ่งนี้ในกรณีของ DSKL (Declarative Sequential Kernel Language) ของOZซึ่งเป็นภาษาที่เหมาะสำหรับสถาบันการศึกษาเช่นนี้ DSKL (หรือ DKL) สามารถดูได้ที่นี่ (ผลการค้นหาแบบสุ่ม) ส่วน Statement และ Values คำจำกัดความที่แน่นอนนั้นไม่สำคัญนอกเหนือจากนี้เป็นภาษาที่ง่ายมากโดยไม่มีตัวแปรที่แก้ไขได้ (จะถูกประกาศและผูกไว้ภายหลัง) และไม่มีการสร้าง OOP
ไม่สามารถเพิ่ม OOP เป็นภาษานามธรรมสำหรับภาษาเคอร์เนลนี้ได้ โดยการเพิ่มชื่อเฉพาะให้กับภาษาเคอร์เนล (NewName) และการใช้การกำหนดขอบเขตแบบท้องถิ่นสามารถทำให้การห่อหุ้มสำเร็จได้ หรือโดยการเพิ่มสถานะที่ไม่แน่นอนให้กับภาษาเคอร์เนล (NewCell) และการใช้การกำหนดขอบเขตที่เหมาะสมของ OOP ด้วยการห่อหุ้มสามารถทำได้ แต่ไม่สามารถทำได้ด้วยภาษาเคอร์เนลที่ระบุเพียงอย่างเดียว
หากเราเพิ่มข้อยกเว้นในภาษาเคอร์เนลเราจะมีภาษาที่ไม่มีการสนับสนุน OOP แต่มีข้อยกเว้น ให้ฉันแสดงวิธี:
การนิยามเครื่องนามธรรมด้วยสแต็กและที่เก็บข้อมูลเราสามารถกำหนดสิ่งที่แต่ละคำสั่งในภาษาของเราควรทำ ( ความหมายของคำสั่ง) ตัวอย่างเช่นskip
ในสแต็กไม่ควรทำอะไรเลยA = 3
ในสแต็กควรผูก (/ รวม) A ถึง (/ ด้วย) 3
เราเริ่มต้นด้วยการเพิ่มไวยากรณ์ของการกำหนดข้อยกเว้นของเรา เราทำสิ่งนี้โดยการเพิ่มอนุประโยคอีกสองข้อลง<statement>
ใน DKL
<statement> ::== ... (old stuff)
| try <statement> catch <id> then <statement> end
| raise <id> end
นี่คือการลอง / จับที่รู้จักและวิธีการยก / โยนข้อยกเว้น
เรากำหนดความหมายของพวกเขาโดยวิธีที่พวกเขาควรทำงานบนเครื่องนามธรรม:
ลองใช้
คำสั่ง semantic คือ: (try <statement1> catch <id> then <statement2> end)
Do:
- กดลงบนสแต็กคำสั่ง semantic
(catch <id> then <statement2> end)
- กดลงบนสแต็กคำสั่ง semantic
(<statement1>)
โปรดทราบว่าคำสั่ง 1 จะอยู่ด้านบนสุดของสแต็กและลองดำเนินการก่อน
เพิ่ม
คำสั่งทางความหมายคือ: (raise <id> end)
ทำ:
- หากไม่มีอะไรเพิ่มเติมอยู่ในสแต็กให้หยุดและรายงานข้อยกเว้นที่ไม่ได้ตรวจสอบ
- มิฉะนั้นให้เปิดข้อความสั่งความหมายแรกจากสแต็ก ถ้าไม่ใช่คำสั่ง catch ให้ไปที่ขั้นตอนที่ 1
- เราได้รับการจับบนแบบฟอร์ม
(catch <id> then <statement> end)
กด(<statement>)
ลงบนกองซ้อน
Catch
ถ้าเราเห็นคำสั่ง catch ในระหว่างการดำเนินการตามปกติหมายความว่าสิ่งใดก็ตามที่ถูกดำเนินการภายในโดยไม่มีการยกระดับขึ้นไปยกเว้นระดับนี้ ดังนั้นเราแค่ป๊อปอัพcatch
สแต็คและไม่ทำอะไรเลย
QED เรามีภาษาที่มีข้อยกเว้นและไม่มีความเป็นไปได้ของ OOP
ฉันได้ลบส่วนของสภาพแวดล้อมออกจากเครื่องนามธรรมเพื่อให้ง่ายขึ้น