官术网_书友最值得收藏!

Syntactic modules

Let's look at another way of creating modules in Reason: syntactic modules. These are modules that are defined using Reason's module syntax. Here's an example:

/* src/Ch03/Ch03_Domain.re */
module Person = {
type t = {id: int, name: string};
let make(id, name) = {id, name};
};

module Company = {
type t = {id: int, name: string, employees: list(Person.t)};
};

Here we define a Domain file module to contain two nested modules: Person and Company. These nested modules actually contain types similar to the ones we defined in src/Ch02/Ch02_Demo.re, but this time with both types named t.

Let's digress a little into the type name  t. This is a standard naming convention in the Reason ecosystem to mean the main type in the module. Usually, you refer to a module along with its main type, for example,  Person.t or Company.t, so it's quite clear exactly which type you mean.

Syntactic modules have the following form: module Name = {...bindings...}; and all the bindings are then available to outside consumers under the module name, for example, Name.binding1, and so on.

Earlier, we said that modules package types and values together. But in the preceding example, you can see that the Ch03_Domain file module itself contains two modules, Person and Company. I actually oversimplified before. Modules can recursively contain other modules! This is a great code organization and namespacing strategy.

Let's look at the (relevant part of the) JavaScript output to understand what the runtime effect of this domain module is:

// src/Ch03/Ch03_Domain.bs.js
function make(id, name) { return [id, name]; }

var Person = [make];
var Company = [];
exports.Person = Person;
exports.Company = Company;

The Person and Company modules are represented as JavaScript arrays, and their t types are completely erased, leaving the arrays almost empty. The arrays contain only what file-level module JavaScript output would contain: values. In fact, this is almost exactly how Reason represents modules when compiled to bytecode or native binary form.

It is not, however, how you might expect a nested module to look in idiomatic JavaScript. Indeed, the BuckleScript compiler does not always emit completely idiomatic JavaScript output. Some of those cases can be fixed (indeed, some have already been); others are compromises that the compiler needs to make to efficiently convert Reason code into JavaScript.
主站蜘蛛池模板: 沂水县| 宜昌市| 金阳县| 凤庆县| 永昌县| 大渡口区| 垫江县| 荥阳市| 兴安盟| 江油市| 康保县| 惠来县| 开化县| 德格县| 彩票| 宣化县| 上虞市| 庆阳市| 嘉善县| 福清市| 泰和县| 措美县| 青龙| 河东区| 乡城县| 吉首市| 茂名市| 阿拉善盟| 陆河县| 滁州市| 安仁县| 泗水县| 瑞安市| 灌南县| 阿鲁科尔沁旗| 上思县| 巨鹿县| 汶川县| 拜泉县| 庄浪县| 灌南县|