[ Skill ] load 函数优化,识别相对路径
https://www.cnblogs.com/yeungchie/
在 cds.lib 文件中定义库的路径,为了规范库定义的管理,经常这样做:
.
|-- cds.lib ------------------- cat --> 1| INCLUDE ./common/cds.lib
`-- common
|-- cds.lib --------------- cat --> 1| INCLUDE ./project/cds.lib
| 2| INCLUDE ./project/cds.lib
|-- project
| |-- cds.lib ----------- cat --> 1| INCLUDE ./project/cds.lib
| | 2| INCLUDE ./project/cds.lib
| | 3| INCLUDE ./project/cds.lib
| |-- layout
| | `-- cds.lib ------- cat --> 1| DEFINE layout_lib1 ./layout_lib1
| | 2| DEFINE layout_lib2 ./layout_lib2
| | 3| 略 ...
| |-- sch
| | `-- cds.lib ------- cat --> 1| 略略 ...
| `-- 略略略 ...
`-- 略略略略 ...
可以看到,对于每一个 cds.lib 文件自身来说,里面用的都是相对路径。
同样的用法在 Skill 中使用 load() / loadi() 函数却不能支持相对路径:
在上一篇随笔 文件读写 & IO 句柄 整理的内容中,发现内置的句柄 piport 可以获取当前文件的路径这一特性,于是有了这一篇。
几个函数
__FILE__
在 Perl 中 __FILE__ 用来获取当前文件的路径,这里模仿一个。
procedure(__FILE__()
get_filename(piport)
); __FILE__
运行:
printf("Current path: %s\n" (__FILE__))
; Current path: /home/yeung/tmp/load.il
__DIR__
正则处理,从 __FILE__ 结果中提取父目录的路径。
需要注意的是,如果是在 CIW 中执行的 __FILE__,它的返回值会是 *ciwInPort*,这种情况直接返回当前路径 getWorkingDir 。
procedure(__DIR__(\@optional path((__FILE__)) "t")
if(pcreMatchp("^\\*.+\\*$" path)
getWorkingDir()
pcreReplace(pcreCompile("(?<=/)[^/]+/*$") path "" 0)
)
); __DIR__
运行:
printf("Current directory: %s\n" (__DIR__))
; Current directory: /home/yeung/tmp/
ycReadRelPath
这个函数用来将 相对路径 转为 绝对路径 。
当路径为 ~ 或者 / 开头是,说明已经是绝对路径了,这种情况直接原封不动返回。
procedure(ycReadRelPath(\@optional file("") "t")
let((path)
path = if(pcreMatchp("^[~/]" file)
file
sprintf(nil "%s/%s" (__DIR__) file)
)
simplifyFilename(path t)
); let
); ycReadRelPath
运行:
printf("Target path: %s\n" ycReadRelPath("./init/load.il"))
; Target path: /home/yeung/tmp/dir/test.il
ycLoad
优化 load 函数。
预留一个 ignores 参数用来优化 loadi 函数。
procedure(ycLoad(file \@optional ignore "tg")
let((path)
path = ycReadRelPath(file)
unless(isFile(path)
error("ycLoad: not a valid file - %A" path)
)
unless(isReadable(path)
error("ycLoad: can't access file - %A" path)
)
if(ignore loadi(path) load(path))
)
); ycLoad
ycLoadi
优化 loadi 函数。
同样可以忽略 load 过程中遇到的错误,打印错误消息,然后继续 load 。
procedure(ycLoadi(file "t")
ycLoad(file t)
); ycLoadi
效果
没有
ycLoad之前let((home wind sync)
home = "/home/yeung/script/skill/tools/"
wind = list("hiForm.il" "windCtrl.il")
sync = list("syncView.il" "support3rd.il")
foreach(x wind
load(strcat(home "src/wind/" x))
)
foreach(x sync
load(strcat(home "/src/sync/" x))
)
); let
非常啰嗦。
其次如果父文件夹改了名,或者移动了位置,还得一个个文件打开检查路径并修改,还要增加无意义的版本。
copy 给别人也不能傻瓜式操作,直接 load 报个错:*Error* load: can't access" 唉 你 这 脚 本 有 问 题 啊 ? "
有了
ycLoad之后ycLoad("src/wind/hiForm.il")
ycLoad("src/wind/windCtrl.il")
ycLoad("src/sync/syncView.il")
ycLoad("src/sync/support3rd.il")
"优雅地" load 完所有文件。

[ Skill ] load 函数优化,识别相对路径的更多相关文章
- c++ 中CImage类Load函数,路径中含有空格应对策略!
最近,在写一些东西的时候,需要用到CImage类将JPG各式的图片转换成BMP图片,传入的是图片的绝对地址:如C:\Users\Administrator\Documents\Visual Studi ...
- 利用Jquery的load函数实现页面的动态加载
利用Jquery的load函数实现页面的动态加载 js的强大功能相信大家都知晓,今天通过jquery的库函数load可以更加方便的实现页面的动态刷新,经过几天的研究与探索,终于有所成效!吾心甚蔚! ...
- 优化关键渲染路径CRP
什么是关键渲染路径? 从收到 HTML.CSS 和 JavaScript 字节到对其进行必需的处理,从而将它们转变成渲染的像素这一过程中有一些中间步骤 浏览器渲染页面前需要先构建 DOM 和 CSSO ...
- JavaScript的妙与乐(一)之 函数优化
JavaScript的妙与乐系列文章主要是展示一些JavaScript上面比较好玩一点的特性和一些有用的技巧,里面很多内容都是我曾经在项目中使用过的一些内容(当然,未必所有技巧的使用频率都很高^_^) ...
- EasyUI之Form load函数IE8下设置Radio或Checkbox的BUG
EasyUI的form的load函数很好用,表单赋值就靠它了,简单方便.我们可以指定url以Ajax加载,如: 1: $('#ff').form('load', 'ajax/common') JSON ...
- 解决load 函数无法赋予变量名的问题
以前非常喜欢使用load函数,因为简单,而且存储相对较大的matrix.list文件更为方便.但是load函数有一个问题是在使用其过程中无法对其载入的data赋予变量名: # save data x ...
- x64 stack walking、调用约定、函数参数识别
k = <rsp> <rip> <frame_count>x64下manual stack walking与x86不同,x86一般情况下有ebp chain,x64 ...
- poj2409 & 2154 polya计数+欧拉函数优化
这两个题都是项链珠子的染色问题 也是polya定理的最基本和最经典的应用之一 题目大意: 用m种颜色染n个珠子构成的项链,问最终形成的等价类有多少种 项链是一个环.通过旋转或者镜像对称都可以得到置换 ...
- SA:T1编写主函数法和T2Matlab自带的SA工具箱GUI法,两种方法实现对二元函数优化求解——Jason niu
%SA:T1法利用Matlab编写主函数实现对定义域[-5,5]上的二元函数求最优解—Jason niu [x,y] = meshgrid(-5:0.1:5,-5:0.1:5); z = x.^2 + ...
随机推荐
- 体验 正式发布 的OSM v1.0.0 版本
2021年10月份发布了OSM 1.0 RC[1],在过去的几个月里,OSM 的贡献者一直在努力为 v1.0.0 版本的发布做准备.2022年2月1日,OSM 团队正式发布 1.0.0 版本[2]. ...
- Java里的new
java里的new的英文意思就是"新的"的意思.在JAVA里就是创建一个新的实例,或者说一个新的对象,一个普通类在没有实例化之前,就是new之前,它的属性,方法等等在内存中都是不存 ...
- VC 常用
转载请注明来源:https://www.cnblogs.com/hookjc/ ------------------------------------------------------------ ...
- centOs7.2安装cmake
最新的3.15的安装不上 wget https://cmake.org/files/v3.5/cmake-3.5.2.tar.gz tar xvf cmake-3.5.2.tar.gz cd cmak ...
- 【Github资源大汇总】 - 王朋
1.Github-iOS备忘 (国人总结的上百个Github上的开发框架和完整App) http://github.ibireme.com/github/list/ios/ 2.不少优秀的 iOS, ...
- SpringAOP/切面编程示例
原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11833954.html Spring AOP/切面编程实例和一些注意事项, 主要是利用注解来实 ...
- 简单的JSON数组转树形结构
function toTree(data) { let result = [] if(!Array.isArray(data)) { return result } data.forEach(item ...
- Puppeteer简介
puppeteer常用API https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md Puppeteer是一个node库,他 ...
- Redis 竟然能用 List 实现消息队列
分布式系统中必备的一个中间件就是消息队列,通过消息队列我们能对服务间进行异步解耦.流量消峰.实现最终一致性. 目前市面上已经有 RabbitMQ.RochetMQ.ActiveMQ.Kafka等,有人 ...
- 多个UID为0的用户如何实现root用户的免密
文章目录 创建用户 创建用户密码 免密脚本 当前主机用户不是root 当前主机用户是root,远程主机多个用户uid为0 利用shell脚本实现远程主机uid为0的用户只有root一个 多个UID=0 ...