Safe Haskell | Safe-Inferred |
---|---|
Language | Haskell2010 |
Synopsis
- type family UniOf a ∷ Type → Type
- data Version = Version {}
- newtype Binder name = Binder {
- unBinder ∷ name
- data Term name uni fun ann
- = Var !ann !name
- | LamAbs !ann !name !(Term name uni fun ann)
- | Apply !ann !(Term name uni fun ann) !(Term name uni fun ann)
- | Force !ann !(Term name uni fun ann)
- | Delay !ann !(Term name uni fun ann)
- | Constant !ann !(Some (ValueOf uni))
- | Builtin !ann !fun
- | Error !ann
- | Constr !ann !Word64 ![Term name uni fun ann]
- | Case !ann !(Term name uni fun ann) !(Vector (Term name uni fun ann))
- data Program name uni fun ann = Program {}
- progAnn ∷ ∀ name uni fun ann. Lens' (Program name uni fun ann) ann
- progVer ∷ ∀ name uni fun ann. Lens' (Program name uni fun ann) Version
- progTerm ∷ ∀ name uni fun ann name uni fun. Lens (Program name uni fun ann) (Program name uni fun ann) (Term name uni fun ann) (Term name uni fun ann)
- bindFunM ∷ Monad m ⇒ (ann → fun → m (Term name uni fun' ann)) → Term name uni fun ann → m (Term name uni fun' ann)
- bindFun ∷ (ann → fun → Term name uni fun' ann) → Term name uni fun ann → Term name uni fun' ann
- mapFun ∷ (ann → fun → fun') → Term name uni fun ann → Term name uni fun' ann
- termAnn ∷ Term name uni fun ann → ann
- data UVarDecl name ann = UVarDecl {
- _uvarDeclAnn ∷ ann
- _uvarDeclName ∷ name
- uvarDeclName ∷ ∀ name ann name. Lens (UVarDecl name ann) (UVarDecl name ann) name name
- uvarDeclAnn ∷ ∀ name ann ann. Lens (UVarDecl name ann) (UVarDecl name ann) ann ann
Documentation
type family UniOf a ∷ Type → Type Source #
Extract the universe from a type.
Instances
type UniOf (Opaque val rep) Source # | |
Defined in PlutusCore.Builtin.Polymorphism | |
type UniOf (SomeConstant uni rep) Source # | |
Defined in PlutusCore.Builtin.Polymorphism | |
type UniOf (CkValue uni fun) Source # | |
Defined in PlutusCore.Evaluation.Machine.Ck | |
type UniOf (CekValue uni fun ann) Source # | |
type UniOf (Term name uni fun ann) Source # | |
Defined in UntypedPlutusCore.Core.Type | |
type UniOf (Term tyname name uni fun ann) Source # | |
Defined in PlutusCore.Core.Type |
The version of Plutus Core used by this program.
The intention is to convey different levels of backwards compatibility for existing scripts: - Major version changes are backwards-incompatible - Minor version changes are backwards-compatible - Patch version changes should be entirely invisible (and we will likely not use this level)
The version used should be changed only when the language itself changes. For example, adding a new kind of term to the language would require a minor version bump; removing a kind of term would require a major version bump.
Similarly, changing the semantics of the language will require a version bump, typically a major one. This is the main reason why the version is actually tracked in the AST: we can have two language versions with identical ASTs but different semantics, so we need to track the version explicitly.
Compatibility is about compatibility for specific scripts, not about e.g. tools which consume scripts. Adding a new kind of term does not change how existing scripts behave, but does change what tools would need to do to process scripts.
Instances
Generic Version Source # | |
Show Version Source # | |
NFData Version Source # | |
Defined in PlutusCore.Version | |
Flat Version Source # | |
Eq Version Source # | |
Ord Version Source # | |
Defined in PlutusCore.Version | |
Hashable Version Source # | |
Pretty Version Source # | |
type Rep Version Source # | |
Defined in PlutusCore.Version type Rep Version = D1 ('MetaData "Version" "PlutusCore.Version" "plutus-core-1.38.0.0-inplace" 'False) (C1 ('MetaCons "Version" 'PrefixI 'True) (S1 ('MetaSel ('Just "_versionMajor") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Natural) :*: (S1 ('MetaSel ('Just "_versionMinor") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Natural) :*: S1 ('MetaSel ('Just "_versionPatch") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Natural)))) |
This is a wrapper to mark the place where the binder is introduced (i.e. LamAbs/TyAbs)
and not where it is actually used (TyVar/Var..).
This marking allows us to skip the (de)serialization of binders at LamAbs/TyAbs positions
iff name
is DeBruijn-encoded (level or index). See for example the instance of Flat
Instances
Functor Binder Source # | |
Show name ⇒ Show (Binder name) Source # | |
Flat (Binder DeBruijn) Source # | |
Flat (Binder FakeNamedDeBruijn) Source # | |
Defined in PlutusCore.Flat | |
Flat (Binder NamedDeBruijn) Source # | |
Defined in PlutusCore.Flat | |
Flat (Binder NamedTyDeBruijn) Source # | |
Defined in PlutusCore.Flat | |
Flat (Binder Name) Source # | |
Flat (Binder TyName) Source # | |
Eq name ⇒ Eq (Binder name) Source # | |
data Term name uni fun ann Source #
The type of Untyped Plutus Core terms. Mirrors the type of Typed Plutus Core terms except
- all types are removed
IWrap
andUnwrap
are removed- type abstractions are replaced with
Delay
- type instantiations are replaced with
Force
The latter two are due to the fact that we don't have value restriction in Typed Plutus Core
and hence a computation can be stuck expecting only a single type argument for the computation
to become unstuck. Therefore we can't just silently remove type abstractions and instantiations and
need to replace them with something else that also blocks evaluation (in order for the semantics
of an erased program to match with the semantics of the original typed one). Delay
and Force
serve exactly this purpose.
Var !ann !name | |
LamAbs !ann !name !(Term name uni fun ann) | |
Apply !ann !(Term name uni fun ann) !(Term name uni fun ann) | |
Force !ann !(Term name uni fun ann) | |
Delay !ann !(Term name uni fun ann) | |
Constant !ann !(Some (ValueOf uni)) | |
Builtin !ann !fun | |
Error !ann | |
Constr !ann !Word64 ![Term name uni fun ann] | |
Case !ann !(Term name uni fun ann) !(Vector (Term name uni fun ann)) |
Instances
data Program name uni fun ann Source #
Instances
progTerm ∷ ∀ name uni fun ann name uni fun. Lens (Program name uni fun ann) (Program name uni fun ann) (Term name uni fun ann) (Term name uni fun ann) Source #
bindFunM ∷ Monad m ⇒ (ann → fun → m (Term name uni fun' ann)) → Term name uni fun ann → m (Term name uni fun' ann) Source #
bindFun ∷ (ann → fun → Term name uni fun' ann) → Term name uni fun ann → Term name uni fun' ann Source #
data UVarDecl name ann Source #
An untyped "variable declaration", i.e. a name for a variable.
UVarDecl | |
|
Instances
Functor (UVarDecl name) Source # | |
Generic (UVarDecl name ann) Source # | |
(Show ann, Show name) ⇒ Show (UVarDecl name ann) Source # | |
type Rep (UVarDecl name ann) Source # | |
Defined in UntypedPlutusCore.Core.Type type Rep (UVarDecl name ann) = D1 ('MetaData "UVarDecl" "UntypedPlutusCore.Core.Type" "plutus-core-1.38.0.0-inplace" 'False) (C1 ('MetaCons "UVarDecl" 'PrefixI 'True) (S1 ('MetaSel ('Just "_uvarDeclAnn") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 ann) :*: S1 ('MetaSel ('Just "_uvarDeclName") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 name))) |
uvarDeclName ∷ ∀ name ann name. Lens (UVarDecl name ann) (UVarDecl name ann) name name Source #
uvarDeclAnn ∷ ∀ name ann ann. Lens (UVarDecl name ann) (UVarDecl name ann) ann ann Source #