Cadence Skill 论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 904|回复: 10

[求助] skill是否不能正常使用递归?

[复制链接]
发表于 2017-7-31 13:47:49 | 显示全部楼层 |阅读模式
本帖最后由 leilei4908 于 2017-7-31 14:56 编辑
  1. procedure(getFiles(@optional (path ".") (files nil) (Sub nil))
  2. prog(()
  3.    unless(isDir(path) return(files))
  4.    foreach(obj getDirFiles(path)
  5.       when(Sub && obj != "." && obj != ".."
  6.          when(isDir(obj) files = getFiles(obj files Sub))
  7.       )
  8.       ; when(isFile(obj) files = cons(simplifyFilename(obj) files))
  9.       when(isFile(obj) files = cons(obj files))
  10.    )
  11.    return(files)
  12. ))
复制代码

大神帮我看下这个哪里有错误
代码目的是利用递归,获取所有文件夹及子文件夹内的文件
结果只能获取当前文件夹内的文件,不能获取子文件夹的

发表于 2017-8-1 09:20:39 | 显示全部楼层
大神,你这程序没有错,Sub 定义为空
这一句不会执行,那就不能获取子文件夹的文件了
when(Sub && obj != "." && obj != ".."
         when(isDir(obj) files = getFiles(obj files Sub))
      )
 楼主| 发表于 2017-8-2 08:27:46 | 显示全部楼层
本帖最后由 leilei4908 于 2017-8-2 08:30 编辑
hyper 发表于 2017-8-1 09:20
大神,你这程序没有错,Sub 定义为空
这一句不会执行,那就不能获取子文件夹的文件了
when(Sub && obj != ...


我在执行的时候,当然会定义Sub为t了
getFiles(path,files, t)


上面的错误主要是:
1.子文件夹的文件名不能通过isFile判断文件是否存在
2.simplifyFilename不能将子文件夹扩展成完整路径


  1. procedure(getFiles(@optional (path ".") (files nil) (Sub nil))
  2. let((objs obj)
  3.    path = simplifyFilename(path)
  4.    objs = isDir(path) && getDirFiles(path) || nil
  5.    foreach(obj objs
  6.       fullpath = strcat(path "\\" obj)
  7.       when(Sub && isDir(fullpath)
  8.          when(obj != "." && obj != ".." files = getFiles(fullpath files Sub))
  9.       )
  10.       when(isFile(fullpath) files = cons(fullpath files))
  11.    )
  12.    files
  13. ))
复制代码

我已经改成这样了,但会获取到重复项,不知道为什么
 楼主| 发表于 2017-8-2 08:27:51 | 显示全部楼层
hyper 发表于 2017-8-1 09:20
大神,你这程序没有错,Sub 定义为空
这一句不会执行,那就不能获取子文件夹的文件了
when(Sub && obj != ...

我在执行的时候,当然会定义Sub为t了
getFiles(path,files, t)
发表于 2017-8-2 13:12:03 | 显示全部楼层
leilei4908 发表于 2017-8-2 08:27
我在执行的时候,当然会定义Sub为t了
getFiles(path,files, t)

1、增加判断是不是空文件夹
2、子文件夹传的是全路径,能不能扩展不会影响吧
发表于 2017-8-2 13:13:55 | 显示全部楼层
hyper 发表于 2017-8-2 13:12
1、增加判断是不是空文件夹
2、子文件夹传的是全路径,能不能扩展不会影响吧

测试结果,不知道是不是你想要的那种

("D:\\hyper\\work\\2017-08\\02\\test\\\313\277\323\241\315\274/\313\277\323\241\315\274.pdf" "D:\\hyper\\work\\2017-08\\02\\test/screen_top.color" "D:\\hyper\\work\\2017-08\\02\\test/DL0802_Yiti_ZZLH01_V1-3.brd.lck" "D:\\hyper\\work\\2017-08\\02\\test/DL0802_Yiti_ZZLH01_V1-3.brd" "D:\\hyper\\work\\2017-08\\02\\test/allegro.jrl")
发表于 2017-8-2 13:17:06 | 显示全部楼层
hyper 发表于 2017-8-2 13:13
测试结果,不知道是不是你想要的那种

("D:\\hyper\\work\\2017-08\\02\\test\\\313\277\323\241\315\2 ...

目录如下

其中,Gerber是空目录
1.png
发表于 2017-8-2 19:26:50 来自手机 | 显示全部楼层
后面再试了下,files只能传进去,返回值始终为nil
发表于 2017-8-2 19:28:48 来自手机 | 显示全部楼层
改用return也一样的效果,不知道大神是怎么搞定的?
 楼主| 发表于 2017-8-3 08:42:33 | 显示全部楼层
hyper 发表于 2017-8-2 19:28
改用return也一样的效果,不知道大神是怎么搞定的?

将完整路径传递给递归函数,用simplifyFilename无法正确获取子文件夹或者子文件的路径
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|网站地图|Cadence Skill 论坛 ( 蜀ICP备13024417号|网站地图

GMT+8, 2018-5-21 11:08 , Processed in 0.637729 second(s), 37 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表