V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
jiyinyiyong
V2EX  ›  问与答

关于 Lisp.. 你所了解到的编程语言都是怎样管理模块的?

  •  
  •   jiyinyiyong · 2012-11-16 10:31:56 +08:00 · 4167 次点击
    这是一个创建于 4395 天前的主题,其中的信息可能已经有所发展或是发生改变。
    在 Lispcn 邮件列表看盖楼.. 为此去把 Scheme 的模块用法看了一些
    再拿来和别的我了解过的编程语言对比...

    Node.js 我最熟悉的, 用 npm 命令可以上传下载中央仓库的模块
    脚本会到系统 Path 和当前路径和父(父*)路径检测 node_modules 文件
    下载的文件是 JS 源码, 可能有 C/C++ 写的扩展自动编译
    简单的比如直接 Github 上下载来, require 函数写对就能用了
    浏览器端按 SeaJS 就是模块在项目路径下, 按路径引用

    Lua 似乎是用户主目录下用 rocks 安装的, 跟 JS 相似点很多
    从路径引用也是有的.

    Python 是用 pip easy_install 命令下载到全局的某个路径.
    Python 的仓库不清楚在哪.. 我猜不止一个吧
    Ruby 使用 gem 命令下载到用户目录下的某个路径
    Gems 至少是有在线的搜索, 仓库模块数量很大
    这样都是引用模块的名字, 虽然也有路径

    Racket 用 raco planet 把模块下载到用户路径下载的某个路径
    Racket 有 PLaneT 中央仓库, 不少的模块
    Guile 模块是放到安装目录下一个 site 文件夹下才能被索引到
    Chicken chicken_install 也是在用户目录下, 下载的代码会被编译到二进制码
    Chicken Eggs 里用不少模块, 目测比 PLaneT 要多
    Scheme 语言还有个 load 函数按照路径引用模块
    不过 Scheme 没有直接类似 JS 的表结构, 暴露的都是函数?

    Clojure 用 lein deps 安装依赖, 在项目路径下一个文件夹放 .jar 包
    根据路径的引用, 安装 Java 的 com.example 好难懂的感觉
    印象比较深的说按 'dir/file.clj' 路径引用不被推荐.
    而自己写的 Clojure 打包可以上传到 clojar 仓库里, 数量就大了

    Haskell 的 cabal 印象最深就是编译, Wiki 和包的数量都很多
    Hackage 上估计不难上传模块, 我没有了解过..
    Haskell 能很自然地按路径引用. 下载的包安装在用户主目录下

    CommonLisp 听说过 QuickLisp 用来管理模块, 可看页面上内容挺少的
    没有使用经验...

    更多语言求补充吧... 还有纠正...
    Node 以外我都只是看了文档尝试下, 错误见谅

    上面凭印象写的.. 细节应该会有错, 我拿这个来对比
    看 Lisp Curse 时我一直在抱怨, Lisp 模块管理工具太不顺手
    自打用了 Linux, 我觉得下载模块拓展一个平台是很正常的事情
    而且 Firefox, GNOME3, Sublime, 这些工具都是靠扩展才强大的

    Lisp 一直被赞誉, 强大的宏, 扩展能力不需要怀疑了
    可是模块管理上, 我能下载模块看几眼文档来直接 require 过来用么?
    Clojure 用的 Java 的包, 大多压缩过的 jar
    Chicken 用的 C 写的模块, 也是下载过来编译了
    Guile 在 GNOME 平台上才玩得好, Racket 是我没看懂的 .plt 文件
    那种从 Github 看文档 clone 下载直接用的感觉就不用想了
    也许对于大项目的语言, Lisp 依然有些特性神一样存在着
    可是相对某些动态语言的灵活, Lisp 真心没那么方便

    ..以上 Scheme 入门水平的个人观点..
    我想再对比下别的语言, 还有一些我不懂的和没考虑到的, 求水..
    7 条回复    1970-01-01 08:00:00 +08:00
    somethin
        1
    somethin  
       2012-11-16 11:23:28 +08:00
    racket 用planet上的模块的话,就是(require (planet owner/lib:version))啊.然后就可以用了啊
    jiyinyiyong
        2
    jiyinyiyong  
    OP
       2012-11-16 11:53:53 +08:00
    @somethin 文档里说是自动下载的. 回想应该是网速原因吧, 我没跑成功
    somethin
        3
    somethin  
       2012-11-16 11:55:22 +08:00
    @jiyinyiyong 哦.如果用drracket的话,可以看到下载状况的.
    jiyinyiyong
        4
    jiyinyiyong  
    OP
       2012-11-16 12:11:30 +08:00
    @somethin 也是, 能看进度体验就好很多了
    还是很不习惯 GUI 去编程, 每种 GUI 设计的都不一样
    qsun
        5
    qsun  
       2012-11-16 12:41:51 +08:00
    SBCL

    (require :asdf-install)
    (asdf-install:install :hunchentoot)
    (require :hunthentoot)
    hunchentoot:*version*
    somethin
        6
    somethin  
       2012-11-16 12:59:50 +08:00
    @jiyinyiyong 恩.drracket支持emacs键绑定.我感觉还蛮好用的.
    duhastmich
        7
    duhastmich  
       2012-11-16 16:35:12 +08:00
    python一般用virtualenv, 那样pip就不会装到全局了, gem差不多的,需要rvm,rbenv这类的, 默认也是装全局的;
    php有个composer, 不用全局,不用路径,代码可从github 导入
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3105 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 14:12 · PVG 22:12 · LAX 06:12 · JFK 09:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.