Merge pull request #888 from hellerve/veit/phantoms

core: add Phantom
This commit is contained in:
Erik Svedäng 2020-06-19 09:30:42 +02:00 committed by GitHub
commit 15bdf38f23
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
35 changed files with 495 additions and 0 deletions

22
core/Phantom.carp Normal file
View File

@ -0,0 +1,22 @@
(doc Phantom "is a type without inhabitants and a free type variable, which is
a fancy way of saying that it has no runtime representation.
When trying to mark types programmatically using something like `the` but
without the need for a special form, `Phantom` comes in handy.
Example:
```
(defn test [a]
(Phantom.ensure a (the (Phantom Int) (Phantom.init))))
(println* (test 123l)) ; this will not compile
```")
(deftype (Phantom a) [])
(defmodule Phantom
(doc ensure "is a function that takes anything and a `Phantom`, ensuring that
the type contained by the `Phantom` and the type of the first parameter match.")
(sig ensure (Fn [a (Phantom a)] a))
(defn ensure [a p] a)
)

View File

@ -162,6 +162,11 @@
Quadruple
</a>
</li>
<li>
<a href="Phantom.html">
Phantom
</a>
</li>
</ul>
</div>
</div>

View File

@ -162,6 +162,11 @@
Quadruple
</a>
</li>
<li>
<a href="Phantom.html">
Phantom
</a>
</li>
</ul>
</div>
</div>

View File

@ -162,6 +162,11 @@
Quadruple
</a>
</li>
<li>
<a href="Phantom.html">
Phantom
</a>
</li>
</ul>
</div>
</div>

View File

@ -162,6 +162,11 @@
Quadruple
</a>
</li>
<li>
<a href="Phantom.html">
Phantom
</a>
</li>
</ul>
</div>
</div>

View File

@ -162,6 +162,11 @@
Quadruple
</a>
</li>
<li>
<a href="Phantom.html">
Phantom
</a>
</li>
</ul>
</div>
</div>

View File

@ -162,6 +162,11 @@
Quadruple
</a>
</li>
<li>
<a href="Phantom.html">
Phantom
</a>
</li>
</ul>
</div>
</div>

View File

@ -162,6 +162,11 @@
Quadruple
</a>
</li>
<li>
<a href="Phantom.html">
Phantom
</a>
</li>
</ul>
</div>
</div>

View File

@ -162,6 +162,11 @@
Quadruple
</a>
</li>
<li>
<a href="Phantom.html">
Phantom
</a>
</li>
</ul>
</div>
</div>

View File

@ -162,6 +162,11 @@
Quadruple
</a>
</li>
<li>
<a href="Phantom.html">
Phantom
</a>
</li>
</ul>
</div>
</div>

View File

@ -162,6 +162,11 @@
Quadruple
</a>
</li>
<li>
<a href="Phantom.html">
Phantom
</a>
</li>
</ul>
</div>
</div>

View File

@ -162,6 +162,11 @@
Quadruple
</a>
</li>
<li>
<a href="Phantom.html">
Phantom
</a>
</li>
</ul>
</div>
</div>

View File

@ -162,6 +162,11 @@
Quadruple
</a>
</li>
<li>
<a href="Phantom.html">
Phantom
</a>
</li>
</ul>
</div>
</div>

View File

@ -162,6 +162,11 @@
Quadruple
</a>
</li>
<li>
<a href="Phantom.html">
Phantom
</a>
</li>
</ul>
</div>
</div>

View File

@ -162,6 +162,11 @@
Quadruple
</a>
</li>
<li>
<a href="Phantom.html">
Phantom
</a>
</li>
</ul>
</div>
</div>

View File

@ -162,6 +162,11 @@
Quadruple
</a>
</li>
<li>
<a href="Phantom.html">
Phantom
</a>
</li>
</ul>
</div>
</div>

View File

@ -162,6 +162,11 @@
Quadruple
</a>
</li>
<li>
<a href="Phantom.html">
Phantom
</a>
</li>
</ul>
</div>
</div>

View File

@ -162,6 +162,11 @@
Quadruple
</a>
</li>
<li>
<a href="Phantom.html">
Phantom
</a>
</li>
</ul>
</div>
</div>

312
docs/core/Phantom.html Normal file
View File

@ -0,0 +1,312 @@
<!DOCTYPE HTML>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
<link rel="stylesheet" href="carp_style.css">
</head>
<body>
<div class="content">
<div class="logo">
<a href="http://github.com/carp-lang/Carp">
<img src="logo.png">
</a>
<div class="title">
core
</div>
<div class="index">
<ul>
<li>
<a href="Dynamic.html">
Dynamic
</a>
</li>
<li>
<a href="Int.html">
Int
</a>
</li>
<li>
<a href="Byte.html">
Byte
</a>
</li>
<li>
<a href="Long.html">
Long
</a>
</li>
<li>
<a href="Bool.html">
Bool
</a>
</li>
<li>
<a href="Float.html">
Float
</a>
</li>
<li>
<a href="Double.html">
Double
</a>
</li>
<li>
<a href="Vector2.html">
Vector2
</a>
</li>
<li>
<a href="Vector3.html">
Vector3
</a>
</li>
<li>
<a href="VectorN.html">
VectorN
</a>
</li>
<li>
<a href="Geometry.html">
Geometry
</a>
</li>
<li>
<a href="Statistics.html">
Statistics
</a>
</li>
<li>
<a href="String.html">
String
</a>
</li>
<li>
<a href="Char.html">
Char
</a>
</li>
<li>
<a href="Pattern.html">
Pattern
</a>
</li>
<li>
<a href="Array.html">
Array
</a>
</li>
<li>
<a href="StaticArray.html">
StaticArray
</a>
</li>
<li>
<a href="IO.html">
IO
</a>
</li>
<li>
<a href="System.html">
System
</a>
</li>
<li>
<a href="Debug.html">
Debug
</a>
</li>
<li>
<a href="Test.html">
Test
</a>
</li>
<li>
<a href="Bench.html">
Bench
</a>
</li>
<li>
<a href="Map.html">
Map
</a>
</li>
<li>
<a href="Maybe.html">
Maybe
</a>
</li>
<li>
<a href="Result.html">
Result
</a>
</li>
<li>
<a href="Pointer.html">
Pointer
</a>
</li>
<li>
<a href="Pair.html">
Pair
</a>
</li>
<li>
<a href="Triple.html">
Triple
</a>
</li>
<li>
<a href="Quadruple.html">
Quadruple
</a>
</li>
<li>
<a href="Phantom.html">
Phantom
</a>
</li>
</ul>
</div>
</div>
<h1>
Phantom
</h1>
<div class="module-description">
<p>is a type without inhabitants and a free type variable, which is
a fancy way of saying that it has no runtime representation.</p>
<p>When trying to mark types programmatically using something like <code>the</code> but
without the need for a special form, <code>Phantom</code> comes in handy.</p>
<p>Example:</p>
<pre><code>(defn test [a]
(Phantom.ensure a (the (Phantom Int) (Phantom.init))))
(println* (test 123l)) ; this will not compile
</code></pre>
</div>
<div class="binder">
<a class="anchor" href="#copy">
<h3 id="copy">
copy
</h3>
</a>
<div class="description">
template
</div>
<p class="sig">
(Fn [(Ref (Phantom a) b)] (Phantom a))
</p>
<span>
</span>
<p class="doc">
<p>copies the <code>Phantom</code>.</p>
</p>
</div>
<div class="binder">
<a class="anchor" href="#delete">
<h3 id="delete">
delete
</h3>
</a>
<div class="description">
template
</div>
<p class="sig">
(Fn [(Phantom a)] ())
</p>
<span>
</span>
<p class="doc">
<p>deletes a <code>Phantom</code>. Should usually not be called manually.</p>
</p>
</div>
<div class="binder">
<a class="anchor" href="#ensure">
<h3 id="ensure">
ensure
</h3>
</a>
<div class="description">
defn
</div>
<p class="sig">
(Fn [a, (Phantom a)] a)
</p>
<pre class="args">
(ensure a p)
</pre>
<p class="doc">
<p>is a function that takes anything and a <code>Phantom</code>, ensuring that
the type contained by the <code>Phantom</code> and the type of the first parameter match.</p>
</p>
</div>
<div class="binder">
<a class="anchor" href="#init">
<h3 id="init">
init
</h3>
</a>
<div class="description">
template
</div>
<p class="sig">
(Fn [] (Phantom a))
</p>
<span>
</span>
<p class="doc">
<p>creates a <code>Phantom</code>.</p>
</p>
</div>
<div class="binder">
<a class="anchor" href="#prn">
<h3 id="prn">
prn
</h3>
</a>
<div class="description">
template
</div>
<p class="sig">
(Fn [(Ref (Phantom a) b)] String)
</p>
<span>
</span>
<p class="doc">
<p>converts a <code>Phantom</code> to a string.</p>
</p>
</div>
<div class="binder">
<a class="anchor" href="#str">
<h3 id="str">
str
</h3>
</a>
<div class="description">
template
</div>
<p class="sig">
(Fn [(Ref (Phantom a) b)] String)
</p>
<span>
</span>
<p class="doc">
<p>converts a <code>Phantom</code> to a string.</p>
</p>
</div>
</div>
</body>
</html>

View File

@ -162,6 +162,11 @@
Quadruple
</a>
</li>
<li>
<a href="Phantom.html">
Phantom
</a>
</li>
</ul>
</div>
</div>

View File

@ -162,6 +162,11 @@
Quadruple
</a>
</li>
<li>
<a href="Phantom.html">
Phantom
</a>
</li>
</ul>
</div>
</div>

View File

@ -162,6 +162,11 @@
Quadruple
</a>
</li>
<li>
<a href="Phantom.html">
Phantom
</a>
</li>
</ul>
</div>
</div>

View File

@ -162,6 +162,11 @@
Quadruple
</a>
</li>
<li>
<a href="Phantom.html">
Phantom
</a>
</li>
</ul>
</div>
</div>

View File

@ -162,6 +162,11 @@
Quadruple
</a>
</li>
<li>
<a href="Phantom.html">
Phantom
</a>
</li>
</ul>
</div>
</div>

View File

@ -162,6 +162,11 @@
Quadruple
</a>
</li>
<li>
<a href="Phantom.html">
Phantom
</a>
</li>
</ul>
</div>
</div>

View File

@ -162,6 +162,11 @@
Quadruple
</a>
</li>
<li>
<a href="Phantom.html">
Phantom
</a>
</li>
</ul>
</div>
</div>

View File

@ -162,6 +162,11 @@
Quadruple
</a>
</li>
<li>
<a href="Phantom.html">
Phantom
</a>
</li>
</ul>
</div>
</div>

View File

@ -162,6 +162,11 @@
Quadruple
</a>
</li>
<li>
<a href="Phantom.html">
Phantom
</a>
</li>
</ul>
</div>
</div>

View File

@ -162,6 +162,11 @@
Quadruple
</a>
</li>
<li>
<a href="Phantom.html">
Phantom
</a>
</li>
</ul>
</div>
</div>

View File

@ -162,6 +162,11 @@
Quadruple
</a>
</li>
<li>
<a href="Phantom.html">
Phantom
</a>
</li>
</ul>
</div>
</div>

View File

@ -162,6 +162,11 @@
Quadruple
</a>
</li>
<li>
<a href="Phantom.html">
Phantom
</a>
</li>
</ul>
</div>
</div>

View File

@ -158,6 +158,11 @@
Quadruple
</a>
</li>
<li>
<a href="Phantom.html">
Phantom
</a>
</li>
</ul>
</div>
</div>

View File

@ -10,6 +10,7 @@
(load "Statistics.carp")
(load "Test.carp")
(load "Bench.carp")
(load "Phantom.carp")
(save-docs Dynamic
Int
@ -40,6 +41,7 @@
Pair
Triple
Quadruple
Phantom
)
(quit)

View File

@ -0,0 +1,7 @@
(Project.config "file-path-print-length" "short")
(load "Phantom.carp")
(defn m [a] (Phantom.ensure a (the (Phantom Int) (Phantom.init))))
(defn main [] (println* (m 123l)))

View File

@ -0,0 +1,2 @@
wrong-phantom.carp:7:28 Inferred Long, can't unify with Int.
wrong-phantom.carp:7:26 Inferred Int, can't unify with Long.