공통 타이프들 조금 정의
This commit is contained in:
@@ -1,5 +1,7 @@
|
|||||||
#+title: on libraries
|
#+title: on libraries
|
||||||
|
|
||||||
|
* libraries and the file system
|
||||||
|
|
||||||
R⁷RS leaves it unspecified how exactly libraries correspond to files:
|
R⁷RS leaves it unspecified how exactly libraries correspond to files:
|
||||||
|
|
||||||
#+begin_quote
|
#+begin_quote
|
||||||
@@ -7,3 +9,11 @@ Programs and libraries are typically stored in files, although in some implement
|
|||||||
#+end_quote
|
#+end_quote
|
||||||
|
|
||||||
thus the implementation of ~define-library~ is open to much interpretation. we could possibly define libraries as first-class objects, or deal with them statically. the former case is appealing to me, as it could massively simplify interactive use.
|
thus the implementation of ~define-library~ is open to much interpretation. we could possibly define libraries as first-class objects, or deal with them statically. the former case is appealing to me, as it could massively simplify interactive use.
|
||||||
|
|
||||||
|
* semantics of declaration order
|
||||||
|
|
||||||
|
mercifully, R⁷RS is similarly ambiguous when it comes to the significance of declaration order. the authors note explicitly example two equally acceptable approaches:
|
||||||
|
|
||||||
|
#+begin_quote
|
||||||
|
One possible implementation of libraries is as follows: _After all cond-expand library declarations are expanded, a new environment is constructed for the library consisting of all imported bindings._ The expressions from all begin, include and include-ci library declarations are expanded in that environment in the order in which they occur in the library. _Alternatively, cond-expand and import declarations may be processed in left to right order interspersed with the processing of other declarations_, with the environment growing as imported bindings are added to it by each import declaration.
|
||||||
|
#+end_quote
|
||||||
|
|||||||
+3
-2
@@ -66,6 +66,7 @@ library
|
|||||||
Gyehoek.GenSym
|
Gyehoek.GenSym
|
||||||
Gyehoek.Jalmot
|
Gyehoek.Jalmot
|
||||||
Gyehoek.Language
|
Gyehoek.Language
|
||||||
|
Gyehoek.Language.Common
|
||||||
Gyehoek.Lift1
|
Gyehoek.Lift1
|
||||||
Gyehoek.Options
|
Gyehoek.Options
|
||||||
Gyehoek.Prelude
|
Gyehoek.Prelude
|
||||||
@@ -111,17 +112,17 @@ library
|
|||||||
, process
|
, process
|
||||||
, recursion-schemes
|
, recursion-schemes
|
||||||
, scientific
|
, scientific
|
||||||
|
, semialign
|
||||||
, string-interpolate
|
, string-interpolate
|
||||||
, tardis
|
, tardis
|
||||||
, template-haskell
|
, template-haskell
|
||||||
, text
|
, text
|
||||||
, text-short
|
, text-short
|
||||||
|
, these
|
||||||
, typed-process
|
, typed-process
|
||||||
, unordered-containers
|
, unordered-containers
|
||||||
, vector
|
, vector
|
||||||
, witherable
|
, witherable
|
||||||
, semialign
|
|
||||||
, these
|
|
||||||
|
|
||||||
hs-source-dirs: src
|
hs-source-dirs: src
|
||||||
default-language: GHC2024
|
default-language: GHC2024
|
||||||
|
|||||||
@@ -0,0 +1,64 @@
|
|||||||
|
{-# LANGUAGE DeriveAnyClass #-}
|
||||||
|
module Gyehoek.Language.Common
|
||||||
|
(
|
||||||
|
-- * Syntax
|
||||||
|
Lib(..)
|
||||||
|
, LibName(..)
|
||||||
|
, Exports
|
||||||
|
, Imports
|
||||||
|
, ExternName(..)
|
||||||
|
, Name(..)
|
||||||
|
) where
|
||||||
|
|
||||||
|
import Gyehoek.Prelude
|
||||||
|
import Data.String (IsString)
|
||||||
|
import Gyehoek.GenSym (Gen)
|
||||||
|
import qualified Gyehoek.Sexp as S
|
||||||
|
|
||||||
|
|
||||||
|
-- | R⁷RS 라이프러리의 표현.
|
||||||
|
data Lib name body = MkLib
|
||||||
|
{ name :: LibName
|
||||||
|
, exports :: Exports name
|
||||||
|
, imports :: Imports name
|
||||||
|
}
|
||||||
|
deriving (Show)
|
||||||
|
|
||||||
|
newtype LibName = MkLibName { getLibName :: NonEmpty Text }
|
||||||
|
deriving stock (Show, Generic, Data, Eq)
|
||||||
|
deriving anyclass (NFData, Hashable)
|
||||||
|
|
||||||
|
-- | A map whose keys are names of library definitions and whose
|
||||||
|
-- values are the names they are exported as. An @⟨identifier⟩@ @x@
|
||||||
|
-- corresponds to an entry @(⟨identifier⟩, ⟨identifier⟩)@, while a
|
||||||
|
-- @(rename ⟨identifier₁⟩ ⟨identifier₂⟩)@ form corresponds to an entry
|
||||||
|
-- @(⟨identifier₁⟩, ⟨identifier₂⟩)@.
|
||||||
|
type Exports name = HashMap name ExternName
|
||||||
|
|
||||||
|
-- | A map whose keys are symbols to be brought into the library's
|
||||||
|
-- environment and whose values are pairs of the library in which the
|
||||||
|
-- symbol is defined and the name the symbol is exported as.
|
||||||
|
type Imports name = HashMap name (LibName, ExternName)
|
||||||
|
|
||||||
|
-- | Representation of an identifier at the library boundary. While
|
||||||
|
-- 'Name's are used within a compilation unit and may be decorated
|
||||||
|
-- with additional structure and metadata, they are exported as
|
||||||
|
-- 'ExternName's, which are essentially just plain strings.
|
||||||
|
newtype ExternName = MkExternName { getExternName :: Text }
|
||||||
|
deriving newtype (Show)
|
||||||
|
|
||||||
|
newtype Name = MkName { inner :: Text }
|
||||||
|
deriving newtype (Show, Eq, Ord, IsString, Gen, Hashable)
|
||||||
|
deriving stock (Generic, Data)
|
||||||
|
deriving anyclass (Wrapped, NFData)
|
||||||
|
|
||||||
|
instance Prefixed Name where
|
||||||
|
prefixed (MkName s) = _Wrapped' . prefixed @Text s . from _Wrapped'
|
||||||
|
|
||||||
|
|
||||||
|
--- DatumIsos
|
||||||
|
|
||||||
|
instance S.DatumIso Name where
|
||||||
|
datumIso = S.decorate S.SynVariable
|
||||||
|
>>> S.symbol
|
||||||
|
>>> S.iso coerce coerce
|
||||||
Reference in New Issue
Block a user