在没有完整的教程的情况下,我正在通过编写一些最终将在命令行脚本中使用的函数来教自己用Factor语言进行编程。要执行的操作是将给定目录中包含的文件名的大小写更改为大写或小写。我在Factor中编写了以下代码来执行此操作:

USING: fry kernel io.directories sequences unicode.case ;
IN: util.directories

: move-each-directory-file>lower ( pathname -- )
    [ dup >lower ] move-each-directory-file ;

: move-each-directory-file>upper ( pathname -- )
    [ dup >upper ] move-each-directory-file ;

: each-directory-file ( pathname quot -- )
    '[ [ @ ] each ] with-directory-files ; inline

: move-each-directory-file ( pathname quot -- )
    '[ @ move-file ] each-directory-file ; inline


我试图将尽可能多的代码分解为可重用的词汇表。我期待提出改进的建议。

#1 楼

评论!评论是很好的,特别是对于现在才刚刚学习Factor的人。诚然,对于Factor来说,它很可读-凝视了一会儿,做了很多谷歌搜索后,我终于明白了-但是评论总是很不错。在线语法-即: name>something ( etc -- etc )部分。因此,我只是假设它是一种好的语法,然后继续。好吧,我终于找到了!是的,这是一个很好的语法-您应该将>something用于将a>b转换为a的函数,这正是您的工作。最好将其称为b / directory-file-names>upper,但这只是个人喜好。

看起来不错。在弄清楚了Factor的工作原理之后,它(对于Factor)可读性很强,实际上让我想更多地使用该语言。另外,据我所知,您在信中遵循的是官方编码风格。干得好。

评论


\ $ \ begingroup \ $
我最终不再使用Factor了,但是我确实写了自己的连接语言,所以我认为这很重要。
\ $ \ endgroup \ $
–莫妮卡基金的诉讼
17-10-8在19:44

#2 楼

我花了好几个小时弄清楚因素。
这是一种非常有趣的语言。使用高阶函数,实际上是将名称转换操作传递给文件移动操作,然后将文件传递操作传递给文件迭代器操作。因此,此代码中的任何地方都没有重复的逻辑

您想到的名字都是一流的: :与each-directory-file中的with-directory-files和语言本身中的io.directories一致

each,... move-each-directory-file,... >lower:完全按照他们说的做,>upper前缀和move->lower后缀都使意义

>upper:很好,但是“路径”可能会稍微好一些,与pathname保持一致


with-directory-files:与该语言中的许多示例保持一致



当我尝试运行程序时,
编译器抱怨:


4: : move-each-directory-file>lower ( pathname -- )
5:     [ dup >lower ] move-each-directory-file ;
                                              ^
No word named “move-each-directory-file” found in current vocabulary search path



似乎无法用另一个未知词来定义一个词。如果我对声明重新排序,就可以加载您的程序:

USING: fry kernel io.directories sequences unicode.case ;
IN: util.directories

: each-directory-file ( pathname quot -- )
    '[ [ @ ] each ] with-directory-files ; inline

: move-each-directory-file ( pathname quot -- )
    '[ @ move-file ] each-directory-file ; inline

: move-each-directory-file>lower ( pathname -- )
    [ dup >lower ] move-each-directory-file ;

: move-each-directory-file>upper ( pathname -- )
    [ dup >upper ] move-each-directory-file ;


评论


\ $ \ begingroup \ $
从技术上讲,您可以添加另一个函数,该函数在传递大小写转换函数时调用dup。 “路径名”也是文档中使用的名称,因此可以说比“路径”更好。另一个有趣的事情是文档功能,因此对于每个功能,可以添加添加非常详细的文档字符串,脚手架工具将为词汇表生成骨架。
\ $ \ endgroup \ $
–ferada
15年6月28日在11:15

\ $ \ begingroup \ $
@ferada,如果您就我会投票赞成的所有问题写出答案
\ $ \ endgroup \ $
– janos
15年6月28日在11:35

#3 楼

现在,对@janos进行完整评论:我之前保存的代码(dup)看起来像这样(顺便说一句。我可以用directories.factor加载
而没有任何问题:

USING: fry kernel io.directories sequences unicode.case ;
IN: util.directories

: each-directory-file ( pathname quot -- )
    '[ [ @ ] each ] with-directory-files ; inline

: move-each-directory-file ( pathname quot -- )
    '[ @ move-file ] each-directory-file ; inline

: transform-each-directory-file ( pathname quot -- )
    '[ dup @ ] move-each-directory-file ; inline

: move-each-directory-file>lower ( pathname -- )
    [ >lower ] transform-each-directory-file ;

: move-each-directory-file>upper ( pathname -- )
    [ >upper ] transform-each-directory-file ;


“路径名”也是
在文档中使用的内容,
是在使用“正确的”命名约定。
功能可以添加非常详细的文档字符串,
脚手架
工具
将为词汇生成骨架。运行后
USE: util.directories
USE: tools.scaffold并填写
点,最后我得到了另一个文件("resource:work" "util.directories" scaffold-vocab),例如


USING: help.markup help.syntax kernel quotations ;
IN: util.directories

HELP: each-directory-file
{ $values
    { "pathname" "a pathname string" } { "quot" quotation }
}
{ $description "Run the quotation on each filename in a directory." } ;

HELP: move-each-directory-file
{ $values
    { "pathname" "a pathname string" } { "quot" quotation }
}
{ $description "Move each file in a directory to the return value of the quotation running on the filename." } ;

HELP: move-each-directory-file>lower
{ $values
    { "pathname" "a pathname string" }
}
{ $description "Rename each file in a directory to lower case." } ;

HELP: move-each-directory-file>upper
{ $values
    { "pathname" "a pathname string" }
}
{ $description "Rename each file in a directory to upper case." } ;

HELP: transform-each-directory-file
{ $values
    { "pathname" "a pathname string" } { "quot" quotation }
}
{ $description "Rename each file in a directory to the return value of running the quotation on the filename." } ;

ARTICLE: "util.directories" "util.directories"
{ $vocab-link "util.directories" }
;

ABOUT: "util.directories"


这对记录所有内容非常好详细信息并通过内置浏览器等访问它。