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() 函数却不能支持相对路径:

*Error* load: can't access file - "./dir/test.il"

在上一篇随笔 文件读写 & 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 函数优化,识别相对路径的更多相关文章

  1. c++ 中CImage类Load函数,路径中含有空格应对策略!

    最近,在写一些东西的时候,需要用到CImage类将JPG各式的图片转换成BMP图片,传入的是图片的绝对地址:如C:\Users\Administrator\Documents\Visual Studi ...

  2. 利用Jquery的load函数实现页面的动态加载

    利用Jquery的load函数实现页面的动态加载  js的强大功能相信大家都知晓,今天通过jquery的库函数load可以更加方便的实现页面的动态刷新,经过几天的研究与探索,终于有所成效!吾心甚蔚! ...

  3. 优化关键渲染路径CRP

    什么是关键渲染路径? 从收到 HTML.CSS 和 JavaScript 字节到对其进行必需的处理,从而将它们转变成渲染的像素这一过程中有一些中间步骤 浏览器渲染页面前需要先构建 DOM 和 CSSO ...

  4. JavaScript的妙与乐(一)之 函数优化

    JavaScript的妙与乐系列文章主要是展示一些JavaScript上面比较好玩一点的特性和一些有用的技巧,里面很多内容都是我曾经在项目中使用过的一些内容(当然,未必所有技巧的使用频率都很高^_^) ...

  5. EasyUI之Form load函数IE8下设置Radio或Checkbox的BUG

    EasyUI的form的load函数很好用,表单赋值就靠它了,简单方便.我们可以指定url以Ajax加载,如: 1: $('#ff').form('load', 'ajax/common') JSON ...

  6. 解决load 函数无法赋予变量名的问题

    以前非常喜欢使用load函数,因为简单,而且存储相对较大的matrix.list文件更为方便.但是load函数有一个问题是在使用其过程中无法对其载入的data赋予变量名: # save data x ...

  7. x64 stack walking、调用约定、函数参数识别

    k = <rsp> <rip> <frame_count>x64下manual stack walking与x86不同,x86一般情况下有ebp chain,x64 ...

  8. poj2409 & 2154 polya计数+欧拉函数优化

    这两个题都是项链珠子的染色问题 也是polya定理的最基本和最经典的应用之一 题目大意: 用m种颜色染n个珠子构成的项链,问最终形成的等价类有多少种 项链是一个环.通过旋转或者镜像对称都可以得到置换 ...

  9. 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 + ...

随机推荐

  1. ApacheCN - 关于我们

    1.简单介绍一下 ApacheCN? ApacheCN 是 2016 年 8 月份就开始搭建网站雏形, 2017 年 6 月份正式全职来做,是国内第一个有组织性.敢带人装逼.敢真的分享.并且敢戴绿帽的 ...

  2. 「CTSC 2011」排列

    「CTSC 2011」排列 要求不存在公差为 A 或者公比为 B 的子列,那么实际上可以把该问题转化为求一个图的最优拓朴序. 任意差为 A 或者比为 B 的两个数连一条边. 求一个合法序列的答案可以用 ...

  3. PriorityQueue的用法和底层实现原理

    定义 PriorityQueue类在Java1.5中引入并作为 Java Collections Framework 的一部分.PriorityQueue是基于优先堆的一个无界队列,这个优先队列中的元 ...

  4. Log4j2日志技术总结

    前言 现在流行是SLF4j和Log4j2组合的日志技术,但为了日志技术归类,故前因后果都将做一下介绍. 市场上流行的日志框架 JUL java util logging Java开发团队开发,Jdk原 ...

  5. Mysql Json函数之搜索 (三)

    本节中的函数对JSON值执行搜索操作,以从其中提取数据,报告数据是否在其中的某个位置或报告其中的数据的路径. JSON_CONTAINS(target, candidate[, path]) 通过返回 ...

  6. JDK目录介绍

    bin目录:存放Java的编译器.解释器等工具(可执行文件). db目录:JDK7附带的一个轻量级的数据库,名字叫做Derby. include目录:存放的调用系统资源的接口文件. jre目录:存放J ...

  7. bom-倒计时

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. Lua 语言: 语法

    转载请注明来源:https://www.cnblogs.com/hookjc/ -- 两个横线开始单行的注释 --[[  加上两个[和]表示     多行的注释.--]] -------------- ...

  9. 通过ANT生成MANIFEST.MF中的Class-Path属性

    原文地址:http://reason2003.iteye.com/blog/1627353 之前做一个项目,主程序打包成一个jar文件,因为用到了很多第三方的lib包,所以直接通过java命令运行ja ...

  10. Bootstrap提供的CDN服务标签与下载文档

    目录 1.引入Bootstrap提供的CDN服务 1.选择下载Bootstrap CDN 二:下载Bootstrap官方文档 1.进入Bootstrap官网,选择3版本中文档. 1.引入Bootstr ...