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. AtCoder Beginner Contest 238 A - F 题解

    AtCoder Beginner Contest 238 \(A - F\) 题解 A - Exponential or Quadratic 题意 判断 \(2^n > n^2\)是否成立? S ...

  2. vue组件中使用watch响应数据

    在vue中,使用watch来响应数据的变化.watch的用法大致有三种.下面代码是watch的一种简单的用法: 普通用法: <template> //视图 <input v-mode ...

  3. Idea Error:java: System Java Compiler was not found in classpath:

    前言 这个问题和IDEA的版本有关系,或者有时不小心把项目错误操作了一步,导致出现,这个属于常见错误 解决办法 1:关闭项目,找一个正常运行的项目,将其.idea..mvn文件夹拷贝出来,替换到不能运 ...

  4. 将string字符串中的换行符进行替换

    /** * 方法名称:replaceBlank * 方法描述: 将string字符串中的换行符进行替换为"" * */ public static String replaceBl ...

  5. Spring @Cacheable 缓存不生效的问题

    最近在项目中使用了Ehcache缓存,使用方式是用Spring提供的 @Cacheable 注解的方式,这种方式简单.快速.方便,推荐使用. 在使用的过程中,遇到了缓存不生效的情况,经过分析处理,总结 ...

  6. Java UDP实现聊天功能代码【转】

    感谢大佬大佬!!!:https://www.cnblogs.com/woshijpf/p/3735684.html 我以前经常写的是基于TCP的网络编程,由于TCP建立连接鼻血要经过三次握手连接,服务 ...

  7. RabbitMQ如何实现延迟队列?(转)

    什么是延迟队列 延迟队列存储的对象肯定是对应的延迟消息,所谓"延迟消息"是指当消息被发送以后,并不想让消费者立即拿到消息,而是等待指定时间后,消费者才拿到这个消息进行消费. 场景一 ...

  8. Javascript疑问【长期更新】

    1.插入 Javacript 的正确位置是? 答:<body> 部分和 <head> 部分均可. 2.外部脚本必须包含 <script> 标签吗? 答:外部脚本不能 ...

  9. KC705E增强版基于FMC接口的 Kintex-7 XC7K325T PCIeX8 接口卡

    一.板卡概述 本板卡基于Xilinx公司的FPGAXC7K325T-2FFG900 芯片,pin_to_pin兼容FPGAXC7K410T-2FFG900 ,支持PCIeX8.64bit DDR3容量 ...

  10. Solution -「LOCAL」模板

    \(\mathcal{Description}\)   OurOJ.   给定一棵 \(n\) 个结点树,\(1\) 为根,每个 \(u\) 结点有容量 \(k_u\).\(m\) 次操作,每次操作 ...