Фактор-скрипт для изменения случая всех имен файлов в каталоге

В отсутствие полноценного учебника я учу себя программировать на языке Фактор , написав кучу функций, которые я в конечном итоге будет использоваться в сценариях командной строки.

Одна общая операция, которую я хочу выполнить, - это изменить регистр имен файлов, содержащихся в данном каталоге, на верхний или нижний регистр. Я написал следующий код для выполнения этой операции в 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

Я попытался как можно больше включить код в многоразовый словарь. Я с нетерпением жду предложений по улучшению.

32 голоса | спросил Adeel Zafar Soomro 28 MaramMon, 28 Mar 2011 04:13:49 +04002011-03-28T04:13:49+04:0004 2011, 04:13:49

3 ответа


3

Комментарии! Комментарии хороши, особенно для людей, которые просто изучают Factor прямо сейчас. По общему признанию, для Factor это довольно читаемо - я, наконец, получил его, посмотрев немного и делаю много Googling, но комментарии всегда приятные.

Я ничего не могу найти о синтаксисе слова : name>something ( etc -- etc ), а именно: >something , Из-за этого я просто предполагаю, что это хороший синтаксис и двигаться дальше. Хорошо, я наконец нашел его! И да, это хороший синтаксис - вы должны использовать a>b для функций, преобразующих a в b, и это именно то, что вы делать. Это может быть лучше названо directory-file-names>upper />lower, но это только личные предпочтения.

Это выглядит хорошо. После выяснения того, как работает Factor, он довольно читабельный (для Factor) и фактически заставляет меня хотеть использовать язык больше. Кроме того, насколько я могу судить, вы следуете официальному стилю кодирования буквально. Молодцы.

ответил Nic Hartley 28 J0000006Europe/Moscow 2015, 05:04:13
3

Я провел несколько часов, выясняя фактор. Это очень интересный язык.

Ваша реализация кажется очень хорошей и простой:

  • Использование функций более высокого порядка, по существу передающих операцию преобразования имени в операцию перемещения файла, которая, в свою очередь, передается в операцию итератора файла. Благодаря этому в этом коде нет дублированной логики

  • Имена, которые вы придумали, являются первоклассными:

    • each-directory-file: соответствует with-directory-files из io.directories и each в сам язык
    • move-each-directory-file, ... >lower, ... >upper: все делают именно то, что они говорят, префикс move- и >lower, >upper суффиксы все имеют смысл
    • pathname: хороший, но «путь» может быть немного лучше, чтобы он соответствовал with-directory-files
    • quot: соответствует многим примерам на языке

Когда я попытался запустить программу, компилятор жалуется:

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 ;
ответил janos 28 J0000006Europe/Moscow 2015, 12:42:14
3

Комментарий к @janos теперь как полный пост:

  • Технически вы можете добавить еще одну функцию, которая вызывает dup, пока прошел в случае функция преобразования. Код, который я сохранил время назад (directories.factor) выглядело так (кстати, я мог загружать это с помощью USE: util.directories без проблем:

    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 ;
    
  • «Имена путей» также что используется в документации , так что используется «правильное» соглашение об именах.

  • Еще одна интересная вещь - средства документации, поэтому для каждого функции можно добавить добавить очень подробные docstrings, строительные леса инструмент будет генерировать скелет для словаря. После запуска USE: tools.scaffold и "resource:work" "util.directories" scaffold-vocab и заполнение Пункты Я закончил с другим файлом (directories-docs.factor), например это:

    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"
    

    Это действительно приятно документировать все более подробно и доступ к нему через встроенный браузер и т. д.

ответил ferada 29 J0000006Europe/Moscow 2015, 16:15:55

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132