最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

Makefile 光學(xué)教程》之面向 Makefile 編程·Scheme R6RS 文檔處理 [LaTeX]

2023-09-16 10:29 作者:緊果唄  | 我要投稿

此教程將計(jì)劃以兩部分內(nèi)容呈現(xiàn),目標(biāo)是從零基礎(chǔ)到 GNU make 最本原理的掌握,這是第二部分內(nèi)容,分按不同的工程類型分成多個(gè)示范項(xiàng)目來(lái)展示。零基本可以先看第一部分:Basic Concepts:

  1. ??? Basic Concepts

  2. ??? Demo Projects

第二部分計(jì)劃提供以下工程示范,當(dāng)前即為第一個(gè) Makefile 腳本應(yīng)用示范:

  1. ??? Scheme R6RS 語(yǔ)言規(guī)范文檔處理 [LaTeX]

  2. ??? Multi threaded Download

  3. ??? C/C++ Project Templates

  4. ??? Erlang Project Templates

  5. ??? Unit Test

完整《Makefile 光學(xué)教程》以及 GNU M4 教程參考開源文檔:https://github.com/Jeangowhy/opendocs/blob/main/Makefile.md


RnRS (the Revised^n Reports on Scheme) 作為 Scheme 社區(qū)的權(quán)威報(bào)告,對(duì)其語(yǔ)言規(guī)范的實(shí)現(xiàn)者具有積極指導(dǎo)意義。比如,按規(guī)范實(shí)現(xiàn)的 rsrn base 模塊,就 提供各種數(shù)據(jù)類型相關(guān)操作的模塊。Guile 3.0.9 版本的源代碼文檔中包含了 R5RS Texinfo 格式文檔,可以作為趁手的備查文檔。源代碼中同樣包含了官方的參考手冊(cè),info 格式可以很方便地轉(zhuǎn)換成其它格式,比如 Markdown。


Make 提供了一套機(jī)制給開發(fā)者編寫擴(kuò)展程序,即各種基于 make 的工具開發(fā),也就是手冊(cè) 12 Extending GNU 'make' 和 13 Integrating GNU 'make' 中所闡述的內(nèi)容,主要是 job slots 在進(jìn)程間的共享。擴(kuò)展 make 就是基于插件機(jī)制編寫工具,并且通過(guò)腳本中的 load 指令加載和執(zhí)行指定方法,或者默認(rèn)的入口方法。官方已經(jīng)在 GNU Make 4.2 集成 Guile。


Guile 是一種嵌入式腳本語(yǔ)言,屬于 Scheme programming language 的一種,即 LISP 語(yǔ)言的一種方言。這類語(yǔ)言使用的語(yǔ)法非常新奇(古典),例如,調(diào)用加法算術(shù)函數(shù) `(+ 1 2)` 得到結(jié)果為 3,嵌套調(diào)用就繼續(xù)加圓括號(hào)。


目前 R6RS 規(guī)范報(bào)告文檔共享在 https://www.r6rs.org/ 網(wǎng)站上,文檔分為四個(gè)部分:


1. Revised6 Report on the Algorithmic Language Scheme

2. Revised6 Report on the Algorithmic Language Scheme — Standard Libraries

3. Revised6 Report on the Algorithmic Language Scheme — Non-Normative Appendices

4. Revised6 Report on the Algorithmic Language Scheme — Rationale


R6RS 文檔原始格式是 48 個(gè) TEX 文檔,外加兩個(gè)書目 Bibliology,計(jì)算其它轉(zhuǎn)換腳本就有 67 個(gè)原始文件。


1. https://www.latex-project.org/?

1. https://tikzit.github.io/

2. https://www.overleaf.com/learn/latex/Learn_LaTeX_in_30_minutes

3. https://www-cs-faculty.stanford.edu/~knuth/index.html

4. https://www-cs-faculty.stanford.edu/~knuth/taocp.html

5. https://lamport.azurewebsites.net/pubs/pubs.html


TeX 是一個(gè)排版系統(tǒng),也是 LaTeX 的基礎(chǔ)。TeX 作者高德納(Donald Ervin Knuth)的傳奇一生中寫作了一部計(jì)算機(jī)科學(xué)巨著 The Art of Computer Programming (TAOCP)。在準(zhǔn)備出版第四卷時(shí),出版社給了他一本已經(jīng)出版的第二卷第二版書過(guò)目過(guò)目,發(fā)現(xiàn)那書的顏值一言難盡,覺得現(xiàn)有的計(jì)算機(jī)排版系統(tǒng)不太行,為了使自己的畢生心血看著美觀,自己寫一個(gè)排版系統(tǒng)。1978 年 TeX 第一版發(fā)布,就得到了許多人的追捧,1982 年高老爺子緊接著發(fā)布了 TeX 的第二版 TeX82。10 年后,1989 年發(fā)布了 TeX3.0,老爺子宣布,除了修改 bug 停止 TeX 的開發(fā),因?yàn)?TeX3.0 已經(jīng)非常穩(wěn)定了。


LaTeX 是基于 TeX 之上定義的一組宏集,相當(dāng)于對(duì) TeX 進(jìn)行了一次封裝。是出版物的高質(zhì)量排版系統(tǒng),一個(gè)文檔準(zhǔn)備系統(tǒng),包括為制作技術(shù)和科學(xué)文件而設(shè)計(jì)的功能。LaTeX 是科學(xué)文獻(xiàn)交流和出版的事實(shí)標(biāo)準(zhǔn)。LaTeX 是免費(fèi)軟件。LaTeX 作者是美國(guó)計(jì)算機(jī)科學(xué)家萊斯利·蘭伯特 Leslie Lamport。


TeX 名字源自 technology 的希臘詞根,而將 Lamport 大佬的名字和 TeX 混合則得到了 LaTeX 的名字。到現(xiàn)在,已經(jīng)出現(xiàn)一堆數(shù)不過(guò)來(lái)的和 TeX 扯關(guān)系的應(yīng)用。


LaTeX 也是宏編程的一種形式,它大量使用斜桿前綴定義宏符號(hào),An introduction to LaTeX 文檔給出以下 Hello World 文檔示范:



LaTeX 目錄分區(qū)條目的宏定義:

https://www.overleaf.com/learn/latex/Sections_and_chapters



現(xiàn)在希望將 R6RS 這些文件的內(nèi)容統(tǒng)一歸納到一個(gè)文件,這樣可以使用 Sublime Text 閱讀文檔時(shí)提供的快捷跳轉(zhuǎn)功能,避免了文檔來(lái)回切換的時(shí)間損失,更嚴(yán)重的是切換動(dòng)作導(dǎo)致注意力的渙散,使文檔閱讀效率大大下降。


文檔壓縮包內(nèi) Makefile 腳本已經(jīng)定義好了各種格式轉(zhuǎn)換的規(guī)則,但對(duì)于我的目標(biāo)不是很重要,只需要它定義的文件列表:



可以使用 Node.js 平臺(tái)提供的 watch 工具監(jiān)視腳本,Linux 系統(tǒng)內(nèi)置 watch 命令,只是用法上有些差別。只要監(jiān)視的文件有改動(dòng)就執(zhí)行相應(yīng)的命令,這會(huì)很方便地調(diào)試 Makefile 腳本。

使用過(guò)濾器只可以監(jiān)視指定的文件,過(guò)濾器文件是一個(gè)返回過(guò)濾函數(shù)的 Node.js 模塊腳本,過(guò)濾函數(shù)名稱隨意,但需要在作為 exports 返回,然后通過(guò) -f 或者 --filter 將文件名傳遞給 watch 工具:

過(guò)濾器中的注解符號(hào)是 TypeScript 編譯器支持的類型修飾符號(hào),Sublime Text 安裝 LSP 插件和 TypeScript 語(yǔ)言服務(wù)器后就可以提示智能提示,并且在 tsc 編譯器中也可以做類型檢查工作。


為了將這些 TEX 文檔按目錄順序?qū)懭胪粋€(gè) TEX 文檔,當(dāng)然這過(guò)過(guò)程引入的文檔頭部定義可能會(huì)導(dǎo)致文檔定義不符合規(guī)范,需要在 Makefile 文檔中增加以下規(guī)則定義:


現(xiàn)在開始需要使用到自動(dòng)變量了,它們?cè)诿顗K中引用當(dāng)前規(guī)則包含的各種信息:


1.? `$<` 自動(dòng)變量表示依賴列表中的第一個(gè)依賴項(xiàng);

2.? `$^` 自動(dòng)變量表示整個(gè)依賴列表,列表中各依賴項(xiàng)之以空格隔開;

3.? `$+` 類似 $^,只是按順序包含目標(biāo)在 Makefile 中的依賴列表,配合鏈接程序使用;

4.? `$*` 模式匹配 % 符號(hào)匹配到的內(nèi)容,稱為主干 stem 并會(huì)替換依賴文件 % 符號(hào);

5.? 函數(shù)內(nèi)可以接收 $1 ~ $9 這幾個(gè)參數(shù),GNU m4 則沒有這個(gè)數(shù)量限制,$0 還是一樣指代宏名。


這里使用了 Makefile 內(nèi)置的 .PHONY 虛構(gòu)目標(biāo),它的功能及目的就是不對(duì)目標(biāo)文件是否存在、更新狀態(tài)等等進(jìn)行隱式的檢測(cè),而是在構(gòu)建目標(biāo)時(shí)無(wú)條件地執(zhí)行命令塊中定義的 shell 命令。目前只是使用 echo 命令打印文檔列表,接下來(lái)就需要考慮是否需要進(jìn)行格式轉(zhuǎn)換?如果需要就調(diào)用系統(tǒng)中安裝好的轉(zhuǎn)換工具程序。當(dāng)前就不需要做格式轉(zhuǎn)換處理,Sublime Text 有可以提供閱讀 TEX 格式文檔的輔助插件。


所以,只需要將文檔內(nèi)容直接寫入指定文件,Makefile 腳本中有多種執(zhí)行命令的形式:


1. 直接使用操作系統(tǒng)提供的標(biāo)準(zhǔn)文件重定向功能,如 >>> 分別表示寫入、附加寫入;

2. 使用 shell 命令,如 cat 等等將內(nèi)容寫入指定文件;

3. 使用 Makefile 內(nèi)置的 file 函數(shù),也使用標(biāo)準(zhǔn)文件重定向一樣尖括號(hào)表示讀寫操作;

4. 使用 Make 提供的插件擴(kuò)展接口,編寫自己的插件實(shí)現(xiàn)文件讀寫功能;


要小心使用這些功能、函數(shù),否則不小心傳遞錯(cuò)誤參數(shù)就可以導(dǎo)致文件內(nèi)容被覆蓋,或者制造一個(gè)巨無(wú)霸文件。另外,在同一個(gè)命令塊中,echo 方式輸出的內(nèi)容會(huì)在 file 函數(shù)輸出內(nèi)容之后,與命令出現(xiàn)的先后順序無(wú)關(guān),由低層數(shù)據(jù)操作邏輯決定的。

《論一個(gè) 10GB 容量的 TeX 文檔的誕生》


接下來(lái),需要引入一個(gè)順號(hào)作為 TeX 文檔中通過(guò) \chapter 標(biāo)記記錄當(dāng)前嵌入文檔的序號(hào)。但是 Makefile 除了字符串,并沒有直接提供數(shù)值運(yùn)算的功能,解決數(shù)值運(yùn)算有以下幾種方法:


1. 使用 shell 函數(shù)調(diào)用外部的數(shù)值計(jì)算能力,如 @echo "1+3=$(shell echo $$((1+2)))";

2. 使用內(nèi)置宏函數(shù)、自定義函數(shù)構(gòu)造出數(shù)值運(yùn)算功能;

3. 使用 Make 提供的插件擴(kuò)展接口,編寫自己的插件實(shí)現(xiàn)數(shù)值運(yùn)算功能;


Make 不支持在執(zhí)行構(gòu)建目標(biāo)的命令中修改變量,這為數(shù)值處理設(shè)置了一些障礙。


注意:shell 使用 `$((1+2))` 這樣的表達(dá)式做數(shù)值運(yùn)算,Makefile 中就需要將 $ 轉(zhuǎn)義為 $$。變量 賦值和引用變量語(yǔ)法上也有差別,后者需要 $var 這樣的表達(dá),同樣需要轉(zhuǎn)義。因?yàn)?shell 命令計(jì)算結(jié)果是臨時(shí)的,所有需要將它保存到文件中重復(fù)利用。即使用 .ONESHELL 或者 export 導(dǎo)出 shell 變量也不行,因?yàn)?.ONESHELL 只能保證命令塊在當(dāng)前目標(biāo)構(gòu)建的時(shí)候同在一個(gè) shell 進(jìn)程中捃命令,一旦更換構(gòu)建目標(biāo),所有環(huán)境變量都被重置。

使用 eval 函數(shù),比如簡(jiǎn)單的使用它來(lái)增加 info 函數(shù)調(diào)用的腳本,另外更重要的是 eval 函數(shù)提供了一種在命令塊中修改變量值的途徑,此外別無(wú)它法:

但是,eval 不能循環(huán)使用同一個(gè)變量,即不能從一個(gè)變量取值并且又給它賦值:

重新整理一下以上內(nèi)容,編寫一個(gè)不需要通過(guò) shell 寫文件來(lái)實(shí)現(xiàn)的步進(jìn)計(jì)數(shù)函數(shù):

說(shuō)明一下 inc 自增函數(shù)的邏輯:首先是 eval 函數(shù)定義了一段“將要”被 make 執(zhí)行的代碼,即 ID?= xxx 的變量賦值語(yǔ)句。并且這個(gè)值需要借助 shell 的 `$((x+y+z))` 這種算術(shù)支持。其中運(yùn)行使用到的值有兩個(gè):一是來(lái)自函數(shù)調(diào)用時(shí) call 函數(shù)傳遞來(lái)過(guò)的參數(shù) $1,它表示步長(zhǎng)值。然后另一個(gè)值來(lái)自一個(gè)為了避免 eval 函數(shù)循環(huán)引用而加入的 inc_ID 變量,這個(gè)變量使用了 $0 自動(dòng)變量表示,它指代函數(shù)名稱 inc,組合得到這個(gè)變量的名稱。


最后,整理以上代碼片段,就可以得到需要的 Makefile 腳本:一個(gè)帶有數(shù)值運(yùn)算功能的腳本,它可以將 LeX 有秩序地按目錄編號(hào)合并到統(tǒng)一的文檔文件中:


合并文檔 2w行81萬(wàn)字符,收錄到Opendocs倉(cāng)庫(kù)


Makefile 光學(xué)教程》之面向 Makefile 編程·Scheme R6RS 文檔處理 [LaTeX]的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
斗六市| 凌源市| 临澧县| 凭祥市| 许昌县| 高陵县| 睢宁县| 兴化市| 平罗县| 锦屏县| 惠安县| 密山市| 鄂托克前旗| 卢湾区| 霸州市| 义乌市| 洛川县| 彰化市| 曲松县| 夏邑县| 诸城市| 永丰县| 林口县| 无极县| 吉水县| 罗甸县| 上杭县| 西平县| 广河县| 邢台市| 临西县| 科技| 鄢陵县| 安多县| 安远县| 伊宁县| 溧阳市| 江北区| 布拖县| 景东| 宁武县|