mirror of
https://github.com/carp-lang/Carp.git
synced 2024-09-11 05:25:28 +03:00
commit
15bdf38f23
22
core/Phantom.carp
Normal file
22
core/Phantom.carp
Normal 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)
|
||||
)
|
@ -162,6 +162,11 @@
|
||||
Quadruple
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="Phantom.html">
|
||||
Phantom
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -162,6 +162,11 @@
|
||||
Quadruple
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="Phantom.html">
|
||||
Phantom
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -162,6 +162,11 @@
|
||||
Quadruple
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="Phantom.html">
|
||||
Phantom
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -162,6 +162,11 @@
|
||||
Quadruple
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="Phantom.html">
|
||||
Phantom
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -162,6 +162,11 @@
|
||||
Quadruple
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="Phantom.html">
|
||||
Phantom
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -162,6 +162,11 @@
|
||||
Quadruple
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="Phantom.html">
|
||||
Phantom
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -162,6 +162,11 @@
|
||||
Quadruple
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="Phantom.html">
|
||||
Phantom
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -162,6 +162,11 @@
|
||||
Quadruple
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="Phantom.html">
|
||||
Phantom
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -162,6 +162,11 @@
|
||||
Quadruple
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="Phantom.html">
|
||||
Phantom
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -162,6 +162,11 @@
|
||||
Quadruple
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="Phantom.html">
|
||||
Phantom
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -162,6 +162,11 @@
|
||||
Quadruple
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="Phantom.html">
|
||||
Phantom
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -162,6 +162,11 @@
|
||||
Quadruple
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="Phantom.html">
|
||||
Phantom
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -162,6 +162,11 @@
|
||||
Quadruple
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="Phantom.html">
|
||||
Phantom
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -162,6 +162,11 @@
|
||||
Quadruple
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="Phantom.html">
|
||||
Phantom
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -162,6 +162,11 @@
|
||||
Quadruple
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="Phantom.html">
|
||||
Phantom
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -162,6 +162,11 @@
|
||||
Quadruple
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="Phantom.html">
|
||||
Phantom
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -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
312
docs/core/Phantom.html
Normal 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>
|
@ -162,6 +162,11 @@
|
||||
Quadruple
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="Phantom.html">
|
||||
Phantom
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -162,6 +162,11 @@
|
||||
Quadruple
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="Phantom.html">
|
||||
Phantom
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -162,6 +162,11 @@
|
||||
Quadruple
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="Phantom.html">
|
||||
Phantom
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -162,6 +162,11 @@
|
||||
Quadruple
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="Phantom.html">
|
||||
Phantom
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -162,6 +162,11 @@
|
||||
Quadruple
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="Phantom.html">
|
||||
Phantom
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -162,6 +162,11 @@
|
||||
Quadruple
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="Phantom.html">
|
||||
Phantom
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -162,6 +162,11 @@
|
||||
Quadruple
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="Phantom.html">
|
||||
Phantom
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -162,6 +162,11 @@
|
||||
Quadruple
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="Phantom.html">
|
||||
Phantom
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -162,6 +162,11 @@
|
||||
Quadruple
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="Phantom.html">
|
||||
Phantom
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -162,6 +162,11 @@
|
||||
Quadruple
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="Phantom.html">
|
||||
Phantom
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -162,6 +162,11 @@
|
||||
Quadruple
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="Phantom.html">
|
||||
Phantom
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -162,6 +162,11 @@
|
||||
Quadruple
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="Phantom.html">
|
||||
Phantom
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -158,6 +158,11 @@
|
||||
Quadruple
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="Phantom.html">
|
||||
Phantom
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -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)
|
||||
|
7
test-for-errors/wrong-phantom.carp
Normal file
7
test-for-errors/wrong-phantom.carp
Normal 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)))
|
@ -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.
|
Loading…
Reference in New Issue
Block a user