Skip to content

Latest commit

 

History

History
43 lines (34 loc) · 1.67 KB

midtern.md

File metadata and controls

43 lines (34 loc) · 1.67 KB

系統程式期中報告--解譯器研讀 本文章是參考以下連結:
https://acl.readthedocs.io/en/latest/zhTW/ch2.html
https://github.com/ccc-c/minilisp

本篇將以: 代表輸入 > 代表打印出來的結果 本篇主要是在探究用c語言製作出建立在Lisp上的minilisp 的解譯器 首先Lisp的特點在於它不同於c的中序表達 它是一個前序表達式的高階語言

舉個例子

:(+ 3 2)
>5

一般來我們會說3+2=5 但在Lisp中 它是先運算子再數字 也可以做到像是以下情況

:(+ 3 2 4 5)
>14

只需要一個運算子就解決整個式子 而不像c需要 3 + 2 + 4 + 5 它也可以只以一個數字來執行 比如說

:(+ 3)
>3

它一開始的受值會是以0為基礎

其他還有包含自行宣告函式
自行定義符號
比大小 定義變數
quote cdr car等等
都是以c語言的函式庫建立出來的
其中還用到了雙重指標(**)
因為牽涉到Garbage Collection(垃圾回收)的記憶體管理機制
所以如果不是使用雙重指標而是單指標
將極有可能出現記憶體被回收釋放而導致本來儲存的資料不可使用的狀況
雖然說整篇文件以lisp的視角都是可以理解且看的懂得
但在指標,資料儲存等地方因為不太精通
導致沒有很了解整份文件是怎麼以c去達成的
但是有嘗試去找到網路上的文章 https://sites.google.com/qtm.ks.edu.tw/qtmcoding/c%E8%AA%9E%E8%A8%80/%E4%B8%AD%E5%BA%8F%E8%BD%89%E5%BE%8C%E5%BA%8F%E5%89%8D%E5%BA%8F 去嘗試理解以c的中序轉乘lisp的前序的運作過程
以堆疊(stack)的方式先去堆進去在慢慢運算後拆解出來