Shiika/require
Ruby
かなりざっくりしてる
ファイル単位でロード
一度ロードしたものは効果が永続する
pros: 使うたびにrequireしなくてよい
cons: 変な依存関係を作ってることに気づきづらい
require "foo/bar": $LOAD_PATHからfoo/bar.rbを探索
require_relative "foo/bar": このファイルを基準として./foo/bar.rbを読み込み
Rust
use std::collections::HashMap: std::collectionsモジュールの構造体HashMapを読み込み
use crate::ty: モジュールtyを読み込み
Crystal
Rubyのrequire_relativeに近い感じか
Node.js
Python
パッケージはモジュールの一種
Deno
URLが書ける
import { add, multiply } from "./arithmetic.ts";
import { add, multiply } from "https://x.nest.land/ramda@0.27.0/source/index.js";
exportするものはexport function foo(のように指定
Go
import ( "github.com/aws/aws-lambda-go/events" ) とすると、events.APIGatewayProxyRequestなどが使えるようになる
これはapigw.goで定義されている(=ファイル名は重要でない)
exportするものは大文字始まりにする(だっけ)
Scala
import java.util.Date;とするとjava.utilパッケージのDateクラスが使えるようになる
import java.util._;
Java
import java.util.Calendar; とするとjava.utilパッケージのCalendarクラスが使えるようになる
import java.util.*;
Haskell
import Data.List Data.Listモジュールをインポート
Scheme(R7RS)
(import (r7rs base)) とか
名前とファイルの対応は処理系定義
C/C++
ヘッダファイルという概念があるのでちょっと毛色が違うか?
Nim
import "gfx/3d/somemodule"
わかったこと
ファイル名大事派と、ファイル名どうでもいい派がある
関数型言語(というかLisp-1言語?)は特定の名前だけインポートする仕組みを持つものが多い
Python Scheme Haskell Node.js Rust
3rd-party libraryの扱い
Ruby
Gemfile(Bundlerの設定ファイル)に gem "rails"と書く
require "rails"で読み込み
実体は ~/.rbenv/versions/3.0.0/lib/ruby/gems/3.0.0/gems/rails-x.y.z/lib/rails.rb とか
Crystal
shard.ymlに 以下のように書くと、 require "html_builder"できるようになる
code:yml
dependencies:
html_builder:
github: crystal-lang/html_builder
shards installで、./lib以下にソースがダウンロードされる
Rust
Cargo.toml(cargoの設定ファイル)に llvm-sys = "90.2.0" みたいに書く
extern crate llvm-sys で読み込み
実体は ~/.cargo/registry/src/github.com-1ecc6299db9ec823/llvm-sys-90.2.0/src/lib.rs
Node.js(npm)
package.jsonに"optparse": "1.0.5"みたいに書く
require('optparse')できるようになる
npm installで./node_modules以下にダウンロードされる
Shiikaではどうするか
永続vs都度
永続:Rubyのように、require xしたら以降どのファイルでもxが使える
都度:Rustのように、xを使う各ファイルでuse xが必要
実装が簡単なのは永続
都度は、ファイル単位で.oへのコンパイルができる?
コンパイル単位
ファイル単位でコンパイル、は難しそうな予感がするな
ライブラリ(gem,crate相当)単位ではコンパイルしたい(可能ならば)
そうするとRubyみたいにgem内のあるファイルだけrequireすることができなくなるが、まあ
あとローカルのrequireと3rd partyのrequireでだいぶ意味が変わってしまうな。
後者は別の予約語にする?
Gemfile的なものに書いたら自動でrequireすることにする?
ライブラリをコンパイルしたときにできるもの
バイナリ(.o)
エクスポートされるものの一覧
とりあえず最初にやることとして
stdlibを事前コンパイルしたい
いまはbuiltin/*をファイル冒頭にくっつけるという無茶をしている
builtin/*.skからbuiltin/builtin.oをつくる