<commit_before><!DOCTYPE html>
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  <title>Lury Specification 0.1 - 3. モジュール</title>
  <script src="../../common/loader.js"></script>
  <script type="text/javascript">loader_load('../../')</script>
</head>
<body>
  <div class="container">
    <div class="row">
      <div class="col-main markdown">

## 3. モジュール

_モジュール(module)_は 0 個以上のクラスを含む集合のことです。Lury におけるモジュールはプログラムを格納する集合としてはクラスよりも大きな、最大の集合です。


<section id="modulesystem">
### 3.1. モジュールシステム

モジュールはソースコードと一対一で対応し、名前によって区別されます。そのモジュール名はソースコードのファイル名またはファイルパスに由来します。ただし、ファイルパスからディレクトリ区切り文字 (`/` または `\`) と拡張子は除去されます。

モジュールは自動的に宣言されます。モジュールが、自身のモジュール名をファイル名以外で指定することはできません。

ソースコードのファイル名が `sample.lr` であったとき、モジュール名は `sample` となります。またファイルがとあるディレクトリ内にある場合、例えば `program/sample.lr` であったとき、モジュール名は `program.sample` となります。

<section id="namespace">
#### 3.1.1. 名前空間

モジュール名は 名前空間(namespace) を構成します。すなわち、そのモジュール名と独立したスコープを持った名前空間となります。これにより、クラスや関数の名前の衝突を防止可能です。モジュール名はディレクトリによりドット `.` で区切られますが、入れ子構造ではありません。

例えば 2 つのモジュール `sample`、`sample.child` があったとして、モジュール `sample.child` は `sample` の集合でも部分集合でもありません。2 つのモジュールは完全に別のモジュールとして扱われます。

また、モジュールは異なるがクラス名が同じ `a.TestClass` と `b.TestClass` は別のクラスであると区別されます。

モジュール名とクラス名をドット `.` で連結し、ただ一つのクラスを識別するための名前を _完全修飾名(fully qualified name)_ と呼びます。例えばモジュール `sample.foo` に所属するクラス `Bar` の完全名は `sample.foo.Bar` となります。

</section>

<section id="modulenamelimit">
#### 3.1.2. モジュール名の制限

モジュールは名前を持ちます。名前に使われる文字と長さに制限はありませんが、Unicode として正しくデコードできる名前であり、名前は少なくとも 1 文字以上でなければなりません。しかし、モジュール名は以下の 2 つによって大きく制限されます。

__文法上の制限__: Lury の import文で使用できるモジュール名は文法上、[識別子](lexical.html#identifier)とドット `.` で使用できる文字で構成される必要があります。すなわち、名前を識別子として表すことのできないモジュールは import文を用いることができず、利用ができません。モジュール名の先頭文字を数値とすることもできません。

__ファイルシステム上の制限__: Lury のモジュール名はファイル名およびファイルパスに由来します。よって、ファイルシステムで使用できない名前をモジュール名として用いることはできません。

Lury の内部で用いられるモジュール名は、外部から指定できないことを条件に、以上の制限を受けません。

</section>
</section>

      </div>
    </div>
  </div>
</body>
</html>
<commit_msg>Add a section 'importstatement'<commit_after><!DOCTYPE html>
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  <title>Lury Specification 0.1 - 3. モジュール</title>
  <script src="../../common/loader.js"></script>
  <script type="text/javascript">loader_load('../../')</script>
</head>
<body>
  <div class="container">
    <div class="row">
      <div class="col-main markdown">

## 3. モジュール

_モジュール(module)_は 0 個以上のクラスを含む集合のことです。Lury におけるモジュールはプログラムを格納する集合としてはクラスよりも大きな、最大の集合です。


<section id="modulesystem">
### 3.1. モジュールシステム

モジュールはソースコードと一対一で対応し、名前によって区別されます。そのモジュール名はソースコードのファイル名またはファイルパスに由来します。ただし、ファイルパスからディレクトリ区切り文字 (`/` または `\`) と拡張子は除去されます。

モジュールは自動的に宣言されます。モジュールが、自身のモジュール名をファイル名以外で指定することはできません。

ソースコードのファイル名が `sample.lr` であったとき、モジュール名は `sample` となります。またファイルがとあるディレクトリ内にある場合、例えば `program/sample.lr` であったとき、モジュール名は `program.sample` となります。

<section id="namespace">
#### 3.1.1. 名前空間

モジュール名は 名前空間(namespace) を構成します。すなわち、そのモジュール名と独立したスコープを持った名前空間となります。これにより、クラスや関数の名前の衝突を防止可能です。モジュール名はディレクトリによりドット `.` で区切られますが、入れ子構造ではありません。

例えば 2 つのモジュール `sample`、`sample.child` があったとして、モジュール `sample.child` は `sample` の集合でも部分集合でもありません。2 つのモジュールは完全に別のモジュールとして扱われます。

また、モジュールは異なるがクラス名が同じ `a.TestClass` と `b.TestClass` は別のクラスであると区別されます。

モジュール名とクラス名をドット `.` で連結し、ただ一つのクラスを識別するための名前を _完全修飾名(fully qualified name)_ と呼びます。例えばモジュール `sample.foo` に所属するクラス `Bar` の完全名は `sample.foo.Bar` となります。

</section>

<section id="modulenamelimit">
#### 3.1.2. モジュール名の制限

モジュールは名前を持ちます。名前に使われる文字と長さに制限はありませんが、Unicode として正しくデコードできる名前であり、名前は少なくとも 1 文字以上でなければなりません。しかし、モジュール名は以下の 2 つによって大きく制限されます。

__文法上の制限__: Lury の import文で使用できるモジュール名は文法上、[識別子](lexical.html#identifier)とドット `.` で使用できる文字で構成される必要があります。すなわち、名前を識別子として表すことのできないモジュールは import文を用いることができず、利用ができません。モジュール名の先頭文字を数値とすることもできません。

__ファイルシステム上の制限__: Lury のモジュール名はファイル名およびファイルパスに由来します。よって、ファイルシステムで使用できない名前をモジュール名として用いることはできません。

Lury の内部で用いられるモジュール名は、外部から指定できないことを条件に、以上の制限を受けません。

</section>
</section>

<section id="importstatement">
### 3.2. import文

```
import<span class="underline"></span>statement   : 'import' import<span class="underline"></span>names
                   | 'public' 'import' import<span class="underline"></span>names

import<span class="underline"></span>names       : import<span class="underline"></span>name
                   | import<span class="underline"></span>names ',' import<span class="underline"></span>name

import<span class="underline"></span>name        : member<span class="underline"></span>name

member<span class="underline"></span>name        : identifier<span class="underline"></span>all
                   | member<span class="underline"></span>name '.' identifier<span class="underline"></span>all

identifier<span class="underline"></span>all     : Identifier
                   | contextual<span class="underline"></span>keyword

contextual<span class="underline"></span>keyword : IdentifierGet
                   | IdentifierSet
                   | IdentifierFile
                   | IdentifierLine
                   | IdentifierExit
                   | IdentifierSuccess
                   | IdentifierFailure
```

import文は他のモジュールを読み込む文です。また、読み込まれたモジュールは import文が書かれたスコープでのみ使用可能です。スコープから脱出すると、もう一度 import文で読み込まない限り、再度モジュールにアクセスすることはできません。

import文はモジュールのソースコードを_展開しません_。import文で読み込まれたモジュールは別の名前空間とスコープを持ちます。同じモジュールを再度読みこむことはできませんが、この場合は単に無視されます。

<section id="basicimport">
#### 3.2.1. 基本 import

基本形となる import 方式です。基本 import では、読み込まれたモジュールは外部に対して公開されません(_private な import_)。

```
# [A.lr]
import B

func<span class="underline"></span>b

if true:
  import C            # モジュール C はこのifブロック内でのみアクセス可能
  func<span class="underline"></span>c
```

```
# [B.lr]
def func<span class="underline"></span>b:
  pass
```

```
# [C.lr]
def func<span class="underline"></span>c:
  pass
```

</section>

<section id="publicimport">
#### 3.2.2. 公開 import

公開 import は、import したことを外部に公開する import です(_public な import_)。以下の例ではモジュール A はモジュール B を import していますが、モジュール B にてモジュール C を公開 import しているため、モジュール A でも新たな import なしでモジュール C にアクセスできます。

```
# [A.lr]
import B

func<span class="underline"></span>b
func<span class="underline"></span>c
```

```
# [B.lr]
public import C

def func<span class="underline"></span>b:
  pass
```

```
# [C.lr]
def func<span class="underline"></span>c:
  pass
```

</section>

</section>

      </div>
    </div>
  </div>
</body>
</html>

{'fraction_non_alphanumeric': 0.14036466519962276, 'fraction_numerical': 0.0069160641307764855, 'mean_word_length': 5.586956521739131, 'pattern_counts': {'":': 0, '<': 109, '<?xml version=': 0, '>': 109, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '5601572', 'n_tokens_mistral': 3893, 'n_tokens_neox': 3529, 'n_words': 370}