今天來介紹一些好用的lib,但這些滿看情境的
這個sci簡單說是eval一個string,但是是有條件的執行
什麼意思呢
有時候我們如果臨時要調整東西,但其實這段跟你商業邏輯沒有太大關係,可以直接讀一個string去處理、去改東西
先講改東西
我舉一個經典的例子,是Javascript相關的
我們程式在任意地方埋一段js的文字,但這個文字就可以操控任何dom
而且你要確保不能寫錯,因為純文字沒有任何的工具幫你檢查(但你可以先丟到console跑跑看在貼回去)
這樣形容好像有點難理解XDD 因為不就是改程式然後部屬一版新的就好了
但如果非常緊急的事,我是不是可以先改個文字控制風險,然後在想辦法處理
譬如在任意一個地方 document.querySelector(...).style.display='none'
就把東西關掉了
另一個是可以方便的修改東西
譬如
我在hello/you的ul/li預設有五個
(for [x (range 5)]
[:li {:md:inline-block "" :ml-4 ""}
[:a {:href "yyy"}
x]])
但今天因為需求要變成少一點,我們就必須要重新佈署
(for [x (range 5)
:when (even? x)]
[:li {:md:inline-block "" :ml-4 ""}
[:a {:href "yyy"}
x]])
但如果寫成文字並限制了他的範圍,是不是就變得相對安全又方便
(let [str-from-somewhere "(->> state (filter odd?))"]
(for [x (sci/eval-string
str-from-somewhere
{:bindings {'state (range 5)}})]
[:li {:md:inline-block "" :ml-4 ""}
[:a {:href "yyy"}
x]]))
另一個案例是發生在文字編輯,純文字混一些參考資料或是要從DB拿資料結合
這樣就可以很簡單的讓使用者檢視但不會開放太多權限