精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Djinn:一個受 Jinja2 啟發的代碼生成器和模板語言

開發 開發工具
我決定制作一個類似于 Jinja2 的工具,但讓我可以通過使用范圍算法轉換數據來生成復雜的文件。這個想法非常簡單:一個直接用 D 語言代碼重寫的模板語言。因為它 就是 D 語言,它可以支持 D 語言所能做的一切。

代碼生成器是非常有用的工具。我有時使用 jinja2 的命令行版本來生成高度冗余的配置文件和其他文本文件,但它在轉換數據方面功能有限。顯然,Jinja2 的作者有不同的想法,而我想要類似于 列表推導list comprehensions 或 D 語言的 可組合范圍composable range 算法之類的東西。

我決定制作一個類似于 Jinja2 的工具,但讓我可以通過使用范圍算法轉換數據來生成復雜的文件。這個想法非常簡單:一個直接用 D 語言代碼重寫的模板語言。因為它 就是 D 語言,它可以支持 D 語言所能做的一切。我想要一個獨立的代碼生成器,但是由于 D 語言的 mixin 特性,同樣的模板語言可以作為嵌入式模板語言工作(例如,Web 應用程序中的 HTML)。有關該技巧的更多信息,請參閱 ??這篇?? 關于在編譯時使用 mixins 將 Brainfuck 轉換為 D 和機器代碼的文章。

像往常一樣,??源碼在 GitLab 上???。??這篇文章中的例子也可以在這里找到??。

Hello world 示例

這是一個演示這個想法的例子:

Hello [= retro("dlrow") ]!
[: enum one = 1; :]
1 + 1 = [= one + one ]

??[= some_expression ]??? 類似于 Jinja2 中的 ??{{ some_expression }}???,它在輸出中呈現一個值。??[: some_statement; :]??? 類似于 ??{% some_statement %}??? ,用于執行完整的代碼語句。我更改了語法,因為 D 也大量使用花括號,并且將兩者混合使模板難以閱讀(還有一些特殊的非 D 指令,比如 ??include???,它們被包裹在 ??[<??? 和 ??>]?? 中)。

如果你將上面的內容保存到一個名為 ??hello.txt.dj??? 的文件中并運行 ??djinn??? 命令行工具,你會得到一個名為 ??hello.txt?? 的文件,其中包含你可能猜到的內容:

Hello world!
1 + 1 = 2

如果你使用過 Jinja2,你可能想知道第二行發生了什么。Djinn 有一個簡化格式化和空格處理的特殊規則:如果源代碼行包含 ??[:??? 語句或 ??[<?? 指令但不包含任何非空格輸出,則整行都會被忽略輸出。空行則仍會原樣呈現。

生成數據

好的,現在來講一些更實用的東西:生成 CSV 數據。

x,f(x)
[: import std.mathspecial;
foreach (x; iota(-1.0, 1.0, 0.1)) :]
[= "%0.1f,%g", x, normalDistribution(x) ]

一個 ??[=??? 和 ??]??? 對可以包含多個用逗號分隔的表達式。如果第一個表達式是一個由雙引號包裹的字符串,則會被解釋為 ??格式化字符串??。下面是輸出結果:

x,f(x)
-1.0,0.158655
-0.9,0.18406
-0.8,0.211855
-0.7,0.241964
-0.6,0.274253
-0.5,0.308538
-0.4,0.344578
-0.3,0.382089
-0.2,0.42074
-0.1,0.460172
0.0,0.5
0.1,0.539828
0.2,0.57926
0.3,0.617911
0.4,0.655422
0.5,0.691462
0.6,0.725747
0.7,0.758036
0.8,0.788145
0.9,0.81594

制作圖片

這個例子展示了一個圖片的生成過程。??經典的 Netpbm 圖像庫定義了一堆圖像格式??,其中一些是基于文本的。例如,這是一個 3 x 3 向量的圖像:

P2 # PGM 格式標識
3 3 # 寬和高
7 # 代表純白色的值(0 代表黑色)
7 0 7
0 0 0
7 0 7

你可以將上述文本保存到名為 ??cross.pgm??? 之類的文件中,很多圖像工具都知道如何解析它。下面是一些 Djinn 代碼,它以相同的格式生成 ??Mandelbrot 集?? 分形:

[:
import std.complex;
enum W = 640;
enum H = 480;
enum kMaxIter = 20;
ubyte mb(uint x, uint y)
{
const c = complex(3.0 * (x - W / 1.5) / W, 2.0 * (y - H / 2.0) / H);
auto z = complex(0.0);
ubyte ret = kMaxIter;
while (abs(z) <= 2 && --ret) z = z * z + c;
return ret;
}
:]
P2
[= W ] [= H ]
[= kMaxIter ]
[: foreach (y; 0..H) :]
[= "%(%s %)", iota(W).map!(x => mb(x, y)) ]

生成的文件大約為 800 kB,但它可以很好地被壓縮為 PNG:

$ # 使用 GraphicsMagick 進行轉換
$ gm convert mandelbrot.pgm mandelbrot.png

結果如下:

解決謎題

這里有一個謎題:

一個 5 行 5 列的網格需要用 1 到 5 的數字填充,每個數字在每一行中限使用一次,在每列中限使用一次(即,制作一個 5 行 5 列的拉丁方格Latin square)。相鄰單元格中的數字還必須滿足所有 ??>?? 大于號表示的不等式。

??幾個月前我使用了 線性規劃linear programming(LP)??。線性規劃問題是具有線性約束的連續變量系統。這次我將使用混合整數線性規劃mixed integer linear programming(MILP),它通過允許整數約束變量來歸納 LP。事實證明,這足以成為 NP 完備的,而 MILP 恰好可以很好地模擬這個謎題。

在上一篇文章中,我使用 Julia 庫 JuMP 來幫助解決這個問題。這次我將使用 ??CPLEX:基于文本的格式??,它受到多個 LP 和 MILP 求解器的支持(如果需要,可以通過現成的工具輕松轉換為其他格式)。這是上一篇文章中 CPLEX 格式的 LP:

Minimize
obj: v
Subject To
ptotal: pr + pp + ps = 1
rock: 4 ps - 5 pp - v <= 0
paper: 5 pr - 8 ps - v <= 0
scissors: 8 pp - 4 pr - v <= 0
Bounds
0 <= pr <= 1
0 <= pp <= 1
0 <= ps <= 1
End

CPLEX 格式易于閱讀,但復雜度高的問題需要大量變量和約束來建模,這使得手工編碼既痛苦又容易出錯。有一些特定領域的語言,例如 ??ZIMPL??,用于以高級方式描述 MILP 和 LP。對于許多問題來說,它們非常酷,但最終它們不如具有良好庫(如 JuMP)支持的通用語言或使用 D 語言的代碼生成器那樣富有表現力。

我將使用兩組變量來模擬這個謎題:??v_{r,c}??? 和 ??i_{r,c,v}???。??v_{r,c}??? 將保存 r 行 c 列單元格的值(從 1 到 5)。??i_{r,c,v}?? 是一個二進制指示器,如果 r 行 c 列的單元格的值是 v,則該指示器值為 1,否則為0。這兩組變量是網格的冗余表示,但第一種表示更容易對不等式約束進行建模,而第二種表示更容易對唯一性約束進行建模。我只需要添加一些額外的約束來強制這兩個表示是一致的。但首先,讓我們從每個單元格必須只有一個值的基本約束開始。從數學上講,這意味著給定行和列的所有指示器都必須為

0,但只有一個值為 1 的例外。這可以通過以下等式強制約束:

[i_{r,c,1} + i_{r,c,2} + i_{r,c,3} + i_{r,c,4} + i_{r,c,5} = 1]

可以使用以下 Djinn 代碼生成對所有行和列的 CPLEX 約束:

\ 單元格只有一個值
[:
foreach (r; iota(N))
foreach (c; iota(N))
:]
[= "%-(%s + %)", vs.map!(v => ivar(r, c, v)) ] = 1
[::]

??ivar()??? 是一個輔助函數,它為我們提供變量名為 ??i??? 的字符串標識符,而 ??vs??? 存儲從 1 到 5 的數字以方便使用。行和列內唯一性的約束完全相同,但在 ??i?? 的其他兩個維度上迭代。

為了使變量組 ??i??? 與變量組 ??v??? 保持一致,我們需要如下約束(請記住,變量組 ??i?? 中只有一個元素的值是非零的):

[i_{r,c,1} + 2i_{r,c,2} + 3i_{r,c,3} + 4i_{r,c,4} + 5i_{r,c,5} = v_{r,c}]

CPLEX 要求所有變量都位于左側,因此 Djinn 代碼如下所示:

\ 連接變量組 i 和變量組 v
[:
foreach (r; iota(N))
foreach (c; iota(N))
:]
[= "%-(%s + %)", vs.map!(v => text(v, ' ', ivar(r, c, v))) ] - [= vvar(r,c) ] = 0
[::]

不等符號相鄰的和左下角值為為 4 單元格的約束寫起來都很簡單。剩下的便是將指示器變量聲明為二進制,并為變量組 ??v??? 設置邊界。加上變量的邊界,總共有 150 個變量和 111 個約束 ??你可以在倉庫中看到完整的代碼??。

GNU 線性規劃工具集 有一個命令行工具可以解決這個 CPLEX MILP。不幸的是,它的輸出是一個包含了所有內容的體積很大的轉儲,所以我使用 awk 命令來提取需要的內容:

$ time glpsol --lp inequality.lp -o /dev/stdout | awk '/v[0-9][0-9]/ { print $2, $4 }' | sort
v00 1
v01 3
v02 2
v03 5
v04 4
v10 2
v11 5
v12 4
v13 1
v14 3
v20 3
v21 1
v22 5
v23 4
v24 2
v30 5
v31 4
v32 3
v33 2
v34 1
v40 4
v41 2
v42 1
v43 3
v44 5
real 0m0.114s
user 0m0.106s
sys 0m0.005s

這是在原始網格中寫出的解決方案:

這些例子只是用來玩的,但我相信你已經明白了。順便說一下,Djinn 代碼倉庫的 ??README.md?? 文件本身是使用 Djinn 模板生成的。

正如我所說,Djinn 也可以用作嵌入在 D 語言代碼中的編譯期模板語言。我最初只是想要一個代碼生成器,得益于 D 語言的元編程功能,這算是一個額外獲得的功能。

責任編輯:龐桂玉 來源: Linux中國
相關推薦

2017-03-20 17:49:21

Java Web模板代碼

2023-08-04 09:00:00

人工智能GPT-4語言模型

2019-01-24 09:46:38

PelicanPython生成器

2012-03-30 09:31:44

WEBCSS

2024-04-07 00:00:01

TypeScript語言REST

2024-06-12 13:40:58

2018-11-19 10:10:51

Python數據庫隨機生成器

2009-07-03 09:29:24

KeelKit

2020-09-08 11:21:48

SQL生成器跨庫

2022-05-19 14:57:30

CSS代碼工具

2015-08-25 15:54:17

程序員代碼生成器

2021-07-23 11:24:54

Create Inc開源G代碼生成器

2022-07-25 10:27:36

背景生成器工具前端

2023-02-07 16:11:41

2023-05-17 16:02:00

CSS工具代碼生成器

2022-03-10 10:48:30

PolyCoder自動代碼生成器語言

2024-08-19 00:00:00

表單生成器開發開源

2025-01-08 08:00:20

2015-09-10 08:45:39

CSS3生成器

2020-10-20 09:53:11

代碼IDEA生成器
點贊
收藏

51CTO技術棧公眾號

午夜av免费在线观看| 1024在线看片| zzzwww在线看片免费| 99国产精品久久久久久久久久 | 中文字幕在线视频区| 久久精品国产免费| 欧美丰满少妇xxxxx| 亚洲啪av永久无码精品放毛片| 最近高清中文在线字幕在线观看1| 国产午夜精品在线观看| 91网站免费看| 综合网在线观看| 999久久久91| 亚洲精品电影在线| 午夜久久福利视频| 9999在线视频| 中文字幕一区三区| 国产欧美一区二区三区不卡高清| 天干夜夜爽爽日日日日| 欧美成人中文| 一区二区三区视频在线| 国产精九九网站漫画| 你懂得影院夜精品a| 亚洲自拍偷拍av| 亚洲欧美日韩另类精品一区二区三区| 亚洲精品中文字幕成人片| 日韩电影在线观看网站| 国内精品视频在线| 黄色香蕉视频在线观看| 国产日韩视频在线| 欧美精品一区二区三区蜜桃| 182午夜在线观看| 天堂8中文在线最新版在线| 亚洲三级视频在线观看| 秋霞毛片久久久久久久久| 亚洲黄色在线免费观看| 久久精品国产精品亚洲综合| 欧美最猛黑人xxxx黑人猛叫黄| 欧美成人三级在线观看| 久久国产成人精品| 亚洲免费视频网站| 亚洲精品第二页| 精品中文字幕一区二区三区四区| 日本乱人伦aⅴ精品| 免费在线观看视频a| 99热国产在线| 亚洲免费视频成人| 在线成人av电影| 福利视频在线播放| 久久色中文字幕| 久99久在线| 熟妇人妻系列aⅴ无码专区友真希| 国产做a爰片久久毛片| 国产精品视频一区二区高潮| 久久久久久久久久久影院| 影音先锋亚洲一区| 欧美精品久久久久久久久久| 久久高清无码视频| 欧美激情在线| 欧美—级a级欧美特级ar全黄| avove在线播放| 欧美三级免费| 欧美贵妇videos办公室| 麻豆changesxxx国产| 欧美永久精品| 欧美激情国产精品| www欧美com| 韩国欧美一区| 97视频免费看| 无码人妻精品一区二区蜜桃色欲| 久久五月激情| 国产精品视频免费观看www| 在线观看视频中文字幕| 麻豆国产一区二区| 成人在线小视频| 国产99久一区二区三区a片| 国产电影一区在线| 国产高清在线精品一区二区三区| 国产精品伦理一区| 国产精品自拍在线| 国产精品推荐精品| 久久电影中文字幕| 中文子幕无线码一区tr| 综合视频免费看| 在线三级电影| 亚洲高清中文字幕| 日韩毛片在线免费看| 欧美三区四区| 51精品久久久久久久蜜臀| 337p日本欧洲亚洲大胆张筱雨| 成人资源在线| 亚洲欧美日韩一区二区三区在线| 久久视频精品在线观看| 日韩午夜电影网| 九九精品在线播放| 少妇一级淫片免费放中国| 日韩精品福利网| 亚洲一区二区中文| 性xxxx18| 中文字幕一区二区视频| 男人日女人视频网站| 午夜激情成人网| 三级在线观看网站| 日韩精品亚洲一区二区三区免费| 国产精品视频xxxx| 亚洲av无码一区二区三区dv| 99国产精品久久久久久久久久久 | 欧美理伦片在线播放| 亚洲另类图片色| 国精产品一区一区二区三区mba| 在线播放亚洲| 国产精品久久久久免费a∨大胸| 国产女18毛片多18精品| 91欧美一区二区| 亚洲资源视频| 色综合桃花网| 在线不卡中文字幕播放| 呦呦视频在线观看| 欧美mv日韩| 97avcom| 国产精品乱码久久久| 91麻豆免费看片| 国产成人生活片| av在线日韩| 亚洲精品mp4| 尤物在线免费视频| 天堂蜜桃91精品| 国产精品一区二区欧美| 日韩伦理在线观看| 狠狠久久亚洲欧美专区| 手机看片国产精品| 日韩在线视屏| 日本精品在线视频| 污视频网站在线播放| 亚洲伦伦在线| 亚洲18女电影在线观看| 亚洲va在线va天堂va偷拍| 亚洲第一福利专区| 久久久视频精品| aa视频在线免费观看| 欧美国产精品一区二区三区| 99精品人妻少妇一区二区| 一区二区三区国产好| 久久精品视频在线观看| 中文在线免费观看| 久久久国产精品午夜一区ai换脸| 欧美乱大交xxxxx潮喷l头像| 天堂av一区| 欧美大尺度激情区在线播放| 91激情在线观看| 国产精品视频在线看| 日本成人黄色网| 国产精品一区二区av日韩在线| 国模视频一区二区| 国产77777| 亚洲午夜日本在线观看| 337p日本欧洲亚洲大胆张筱雨| 综合久久久久| 99久久伊人精品影院| 黄色网页在线免费看| 欧美欧美欧美欧美| 日本黄色免费片| 久久99九九99精品| 日本福利视频导航| 亚洲精品66| 久久夜色精品国产欧美乱| 国产又粗又猛又爽又黄视频 | 欧洲日韩一区二区三区| 99久久精品免费视频| 奇米精品一区二区三区四区| 神马欧美一区二区| 亚洲国产aⅴ精品一区二区三区| zzjj国产精品一区二区| 99久久精品国产色欲| 亚洲中国最大av网站| 中文成人无字幕乱码精品区| 99pao成人国产永久免费视频| 国产精品免费视频一区二区| 国产夫妻在线播放| 亚洲石原莉奈一区二区在线观看| 中文字幕第三页| 成人欧美一区二区三区1314| 四虎国产精品免费| 99国产精品久久久久久久成人热 | 中文字幕在线不卡| 国产裸体视频网站| 国产日韩亚洲| 日韩欧美亚洲日产国| 自拍偷拍亚洲图片| 久久久久中文字幕2018| 暖暖视频在线免费观看| 欧美图区在线视频| 青青草原国产视频| www亚洲一区| 日本黄色福利视频| 伊人久久大香线蕉av超碰演员| 欧美日韩国产高清视频| 欧美综合影院| 午夜精品视频网站| 中文字幕在线播放| 精品福利av导航| 男人天堂视频网| 亚洲综合免费观看高清完整版| 亚洲国产欧美视频| 国内成人免费视频| 日本黄网站免费| 午夜日韩福利| 日本一区二区不卡高清更新| 精品国产亚洲一区二区三区| 777777777亚洲妇女| 91美女视频在线| 亚洲国产高清高潮精品美女| 亚洲无码精品国产| 精品久久久久久久久久久| 日韩免费av一区| 久久中文字幕电影| 巨乳女教师的诱惑| 蜜臀久久久久久久| 免费黄色日本网站| 欧美一区影院| 亚洲三区在线| 在线日本制服中文欧美| 99re在线播放| 羞羞视频在线观看一区二区| 日本精品免费一区二区三区| 精品精品导航| 久久综合久久八八| 最新97超碰在线| 国产亚洲成精品久久| 天堂在线观看视频| 精品久久久久久久久久久久久久久久久 | 在线观看免费污视频| 一区二区高清| 国产真实老熟女无套内射| 小小影院久久| 亚洲成人第一| 国产真实有声精品录音| 久久久久久久久一区| 波多野结衣欧美| 亚洲综合中文字幕在线| 欧美三级电影网址| 国产精品视频久久久| 中文另类视频| 国产成人一区二| 欧美黑人粗大| 清纯唯美亚洲激情| 在线观看的黄色| 一本久久a久久免费精品不卡| 成人网欧美在线视频| 亚洲人成午夜免电影费观看| 久久久久久国产三级电影| 午夜av在线播放| 美女av一区二区| 国产乱色在线观看| 欧美成人网在线| 午夜影院免费在线| 久久99视频精品| 日本伦理一区二区| 久久久久久久国产精品| 久久一卡二卡| 韩国三级日本三级少妇99| 丁香花在线高清完整版视频| 欧美激情在线观看| av不卡高清| 青草热久免费精品视频| 亚洲欧美小说色综合小说一区| 国内精品小视频在线观看| 色黄网站在线观看| 性欧美视频videos6一9| 牛牛精品一区二区| 日本久久久a级免费| 日本一区二区电影| 日韩美女毛茸茸| 日本午夜精品久久久久| 国a精品视频大全| 国产中文在线播放| 日本不卡视频在线播放| 成人做爰免费视频免费看| 国产在线拍偷自揄拍精品| 精品视频91| 精品久久精品久久| 日本a口亚洲| 国产免费一区二区三区四在线播放| 久久婷婷蜜乳一本欲蜜臀| 国产日韩第一页| 在线看三级电影| 亚洲亚洲人成综合网络| 一级片中文字幕| 在线精品视频免费播放| 国产精品欧美综合亚洲| 欧美tickling网站挠脚心| 熟妇人妻一区二区三区四区 | 国产精品9999| 精品一区二区三区中文字幕视频 | 亚洲国产成人一区二区三区| 黄色av片三级三级三级免费看| 亚洲免费在线电影| 在线观看亚洲欧美| 欧美日韩精品系列| 人成网站在线观看| 中文字幕亚洲在线| 国内高清免费在线视频| 欧美中文字幕在线| 中文字幕日本一区| 欧美不卡1区2区3区| 久久久久久久久久久妇女| 青青草国产精品视频| 精品一区二区三区的国产在线播放| 俄罗斯黄色录像| 国产精品久久久久久久久动漫 | 欧美在线国产| 国产福利一区视频| 国产成人在线观看| 亚洲一二三精品| 精品成人久久av| 国产毛片毛片毛片毛片| 亚洲人成啪啪网站| jizz一区二区三区| 91久久在线播放| 精品美女视频| 免费看国产一级片| 国产黄色91视频| 中文字幕91视频| 色婷婷综合五月| 日本人妻熟妇久久久久久| 久久视频在线视频| 中文字幕在线看片| 国产精品一区二区三区不卡| 欧美在线免费| 午夜xxxxx| 国产精品美女久久福利网站| 性色av免费观看| 日韩大片免费观看视频播放| 久久久国产免费| 国产精品久久久久毛片大屁完整版| 爱情岛论坛vip永久入口| 99久久综合精品| 久久97人妻无码一区二区三区| 欧美精品乱码久久久久久| 国产色在线 com| 欧美亚洲成人网| 狠狠久久伊人| 国产二区视频在线| 成人免费观看视频| 久久精品这里只有精品| 91精品国产色综合久久不卡电影| 日本黄色片在线观看| 国产精品免费电影| 精品国产一区二区三区久久久蜜臀 | 久久爱www成人| 成熟丰满熟妇高潮xxxxx视频| 成人毛片老司机大片| 久久精品视频久久| 精品成人一区二区| 国产啊啊啊视频在线观看| 99国精产品一二二线| 欧美精品网站| 国产精品91av| 亚洲电影激情视频网站| 黄色成人一级片| 97在线视频国产| 羞羞色国产精品网站| 黑森林福利视频导航| 久久久91精品国产一区二区精品| 日本熟女毛茸茸| 影音先锋欧美精品| 日韩午夜视频在线| 4444在线观看| aaa国产一区| 日本中文字幕在线| 伊人精品在线观看| 日韩大陆av| 国产一级大片免费看| 国产91精品免费| 韩国av中文字幕| 亚洲性线免费观看视频成熟| 欧美系列精品| 国产欧美123| 99在线精品观看| 最新中文字幕在线观看视频| 中文字幕亚洲欧美一区二区三区 | 黄免费在线观看| 欧美日韩精品一区二区在线播放| 在线免费观看的av| 久久riav| 久久99久久久欧美国产| 免费在线观看日韩| 国产视频在线一区二区| 日本国产亚洲| 北条麻妃在线视频观看| 欧美国产精品v| 亚洲精品综合久久| 国产精品老牛影院在线观看| 中文字幕一区二区av| 欧美 日本 国产| 91麻豆精品国产91久久久使用方法| 丁香花在线电影小说观看| 日韩三级电影网站| 国产不卡视频一区二区三区| 无码人妻精品一区二区三区9厂|