mirror of
https://github.com/KevinMidboe/linguist.git
synced 2025-10-29 09:40:21 +00:00
add Pony language
This commit is contained in:
3
.gitmodules
vendored
3
.gitmodules
vendored
@@ -674,3 +674,6 @@
|
|||||||
[submodule "vendor/grammars/sublime-typescript"]
|
[submodule "vendor/grammars/sublime-typescript"]
|
||||||
path = vendor/grammars/sublime-typescript
|
path = vendor/grammars/sublime-typescript
|
||||||
url = https://github.com/Microsoft/TypeScript-Sublime-Plugin
|
url = https://github.com/Microsoft/TypeScript-Sublime-Plugin
|
||||||
|
[submodule "vendor/grammars/sublime-pony"]
|
||||||
|
path = vendor/grammars/sublime-pony
|
||||||
|
url = https://github.com/CausalityLtd/sublime-pony
|
||||||
|
|||||||
@@ -505,6 +505,8 @@ vendor/grammars/sublime-nix:
|
|||||||
vendor/grammars/sublime-opal/:
|
vendor/grammars/sublime-opal/:
|
||||||
- source.opal
|
- source.opal
|
||||||
- source.opalsysdefs
|
- source.opalsysdefs
|
||||||
|
vendor/grammars/sublime-pony:
|
||||||
|
- source.pony
|
||||||
vendor/grammars/sublime-robot-plugin:
|
vendor/grammars/sublime-robot-plugin:
|
||||||
- text.robot
|
- text.robot
|
||||||
vendor/grammars/sublime-rust:
|
vendor/grammars/sublime-rust:
|
||||||
|
|||||||
@@ -2604,6 +2604,13 @@ PogoScript:
|
|||||||
tm_scope: source.pogoscript
|
tm_scope: source.pogoscript
|
||||||
ace_mode: text
|
ace_mode: text
|
||||||
|
|
||||||
|
Pony:
|
||||||
|
type: programming
|
||||||
|
extensions:
|
||||||
|
- .pony
|
||||||
|
tm_scope: source.pony
|
||||||
|
ace_mode: text
|
||||||
|
|
||||||
PostScript:
|
PostScript:
|
||||||
type: markup
|
type: markup
|
||||||
extensions:
|
extensions:
|
||||||
|
|||||||
30
samples/Pony/circle.pony
Normal file
30
samples/Pony/circle.pony
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
use "collections"
|
||||||
|
|
||||||
|
class Circle
|
||||||
|
var _radius: F32
|
||||||
|
|
||||||
|
new create(radius': F32) =>
|
||||||
|
_radius = radius'
|
||||||
|
|
||||||
|
fun ref get_radius(): F32 =>
|
||||||
|
_radius
|
||||||
|
|
||||||
|
fun ref get_area(): F32 =>
|
||||||
|
F32.pi() * _radius.pow(2)
|
||||||
|
|
||||||
|
fun ref get_circumference(): F32 =>
|
||||||
|
2 * _radius * F32.pi()
|
||||||
|
|
||||||
|
actor Main
|
||||||
|
new create(env: Env) =>
|
||||||
|
|
||||||
|
for i in Range[F32](1.0, 101.0) do
|
||||||
|
let c = Circle(i)
|
||||||
|
|
||||||
|
var str =
|
||||||
|
"Radius: " + c.get_radius().string() + "\n" +
|
||||||
|
"Circumference: " + c.get_circumference().string() + "\n" +
|
||||||
|
"Area: " + c.get_area().string() + "\n"
|
||||||
|
|
||||||
|
env.out.print(str)
|
||||||
|
end
|
||||||
32
samples/Pony/counter.pony
Normal file
32
samples/Pony/counter.pony
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
use "collections"
|
||||||
|
|
||||||
|
actor Counter
|
||||||
|
var _count: U32
|
||||||
|
|
||||||
|
new create() =>
|
||||||
|
_count = 0
|
||||||
|
|
||||||
|
be increment() =>
|
||||||
|
_count = _count + 1
|
||||||
|
|
||||||
|
be get_and_reset(main: Main) =>
|
||||||
|
main.display(_count)
|
||||||
|
_count = 0
|
||||||
|
|
||||||
|
actor Main
|
||||||
|
var _env: Env
|
||||||
|
|
||||||
|
new create(env: Env) =>
|
||||||
|
_env = env
|
||||||
|
|
||||||
|
var count: U32 = try env.args(1).u32() else 10 end
|
||||||
|
var counter = Counter
|
||||||
|
|
||||||
|
for i in Range[U32](0, count) do
|
||||||
|
counter.increment()
|
||||||
|
end
|
||||||
|
|
||||||
|
counter.get_and_reset(this)
|
||||||
|
|
||||||
|
be display(result: U32) =>
|
||||||
|
_env.out.print(result.string())
|
||||||
261
samples/Pony/gups-opt.pony
Normal file
261
samples/Pony/gups-opt.pony
Normal file
@@ -0,0 +1,261 @@
|
|||||||
|
use "options"
|
||||||
|
use "time"
|
||||||
|
use "collections"
|
||||||
|
|
||||||
|
class Config
|
||||||
|
var logtable: U64 = 20
|
||||||
|
var iterate: U64 = 10000
|
||||||
|
var logchunk: U64 = 10
|
||||||
|
var logactors: U64 = 2
|
||||||
|
|
||||||
|
fun ref apply(env: Env): Bool =>
|
||||||
|
var options = Options(env)
|
||||||
|
|
||||||
|
options
|
||||||
|
.add("logtable", "l", I64Argument)
|
||||||
|
.add("iterate", "i", I64Argument)
|
||||||
|
.add("chunk", "c", I64Argument)
|
||||||
|
.add("actors", "a", I64Argument)
|
||||||
|
|
||||||
|
for option in options do
|
||||||
|
match option
|
||||||
|
| ("table", var arg: I64) => logtable = arg.u64()
|
||||||
|
| ("iterate", var arg: I64) => iterate = arg.u64()
|
||||||
|
| ("chunk", var arg: I64) => logchunk = arg.u64()
|
||||||
|
| ("actors", var arg: I64) => logactors = arg.u64()
|
||||||
|
| let err: ParseError =>
|
||||||
|
err.report(env.out)
|
||||||
|
env.out.print(
|
||||||
|
"""
|
||||||
|
gups_opt [OPTIONS]
|
||||||
|
--table N log2 of the total table size. Defaults to 20.
|
||||||
|
--iterate N number of iterations. Defaults to 10000.
|
||||||
|
--chunk N log2 of the chunk size. Defaults to 10.
|
||||||
|
--actors N log2 of the actor count. Defaults to 2.
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
env.out.print(
|
||||||
|
"logtable: " + logtable.string() +
|
||||||
|
"\niterate: " + iterate.string() +
|
||||||
|
"\nlogchunk: " + logchunk.string() +
|
||||||
|
"\nlogactors: " + logactors.string()
|
||||||
|
)
|
||||||
|
true
|
||||||
|
|
||||||
|
actor Main
|
||||||
|
let _env: Env
|
||||||
|
let _config: Config = Config
|
||||||
|
|
||||||
|
var _updates: U64 = 0
|
||||||
|
var _confirm: U64 = 0
|
||||||
|
let _start: U64
|
||||||
|
var _actors: Array[Updater] val
|
||||||
|
|
||||||
|
new create(env: Env) =>
|
||||||
|
_env = env
|
||||||
|
|
||||||
|
if _config(env) then
|
||||||
|
let actor_count = 1 << _config.logactors
|
||||||
|
let loglocal = _config.logtable - _config.logactors
|
||||||
|
let chunk_size = 1 << _config.logchunk
|
||||||
|
let chunk_iterate = chunk_size * _config.iterate
|
||||||
|
|
||||||
|
_updates = chunk_iterate * actor_count
|
||||||
|
_confirm = actor_count
|
||||||
|
|
||||||
|
var updaters = recover Array[Updater](actor_count) end
|
||||||
|
|
||||||
|
for i in Range[U64](0, actor_count) do
|
||||||
|
updaters.push(Updater(this, actor_count, i, loglocal, chunk_size,
|
||||||
|
chunk_iterate * i))
|
||||||
|
end
|
||||||
|
|
||||||
|
_actors = consume updaters
|
||||||
|
_start = Time.nanos()
|
||||||
|
|
||||||
|
for a in _actors.values() do
|
||||||
|
a.start(_actors, _config.iterate)
|
||||||
|
end
|
||||||
|
else
|
||||||
|
_start = 0
|
||||||
|
_actors = recover Array[Updater] end
|
||||||
|
end
|
||||||
|
|
||||||
|
be done() =>
|
||||||
|
if (_confirm = _confirm - 1) == 1 then
|
||||||
|
for a in _actors.values() do
|
||||||
|
a.done()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
be confirm() =>
|
||||||
|
_confirm = _confirm + 1
|
||||||
|
|
||||||
|
if _confirm == _actors.size() then
|
||||||
|
let elapsed = (Time.nanos() - _start).f64()
|
||||||
|
let gups = _updates.f64() / elapsed
|
||||||
|
|
||||||
|
_env.out.print(
|
||||||
|
"Time: " + (elapsed / 1e9).string() +
|
||||||
|
"\nGUPS: " + gups.string()
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
actor Updater
|
||||||
|
let _main: Main
|
||||||
|
let _index: U64
|
||||||
|
let _updaters: U64
|
||||||
|
let _chunk: U64
|
||||||
|
let _mask: U64
|
||||||
|
let _loglocal: U64
|
||||||
|
|
||||||
|
let _output: Array[Array[U64] iso]
|
||||||
|
let _reuse: List[Array[U64] iso] = List[Array[U64] iso]
|
||||||
|
var _others: (Array[Updater] val | None) = None
|
||||||
|
var _table: Array[U64]
|
||||||
|
var _rand: U64
|
||||||
|
|
||||||
|
new create(main:Main, updaters: U64, index: U64, loglocal: U64, chunk: U64,
|
||||||
|
seed: U64)
|
||||||
|
=>
|
||||||
|
_main = main
|
||||||
|
_index = index
|
||||||
|
_updaters = updaters
|
||||||
|
_chunk = chunk
|
||||||
|
_mask = updaters - 1
|
||||||
|
_loglocal = loglocal
|
||||||
|
|
||||||
|
_rand = PolyRand.seed(seed)
|
||||||
|
_output = _output.create(updaters)
|
||||||
|
|
||||||
|
let size = 1 << loglocal
|
||||||
|
_table = Array[U64].undefined(size)
|
||||||
|
|
||||||
|
var offset = index * size
|
||||||
|
|
||||||
|
try
|
||||||
|
for i in Range[U64](0, size) do
|
||||||
|
_table(i) = i + offset
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
be start(others: Array[Updater] val, iterate: U64) =>
|
||||||
|
_others = others
|
||||||
|
iteration(iterate)
|
||||||
|
|
||||||
|
be apply(iterate: U64) =>
|
||||||
|
iteration(iterate)
|
||||||
|
|
||||||
|
fun ref iteration(iterate: U64) =>
|
||||||
|
let chk = _chunk
|
||||||
|
|
||||||
|
for i in Range(0, _updaters) do
|
||||||
|
_output.push(
|
||||||
|
try
|
||||||
|
_reuse.pop()
|
||||||
|
else
|
||||||
|
recover Array[U64](chk) end
|
||||||
|
end
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
for i in Range(0, _chunk) do
|
||||||
|
var datum = _rand = PolyRand(_rand)
|
||||||
|
var updater = (datum >> _loglocal) and _mask
|
||||||
|
|
||||||
|
try
|
||||||
|
if updater == _index then
|
||||||
|
_table(i) = _table(i) xor datum
|
||||||
|
else
|
||||||
|
_output(updater).push(datum)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
try
|
||||||
|
let to = _others as Array[Updater] val
|
||||||
|
|
||||||
|
repeat
|
||||||
|
let data = _output.pop()
|
||||||
|
|
||||||
|
if data.size() > 0 then
|
||||||
|
to(_output.size()).receive(consume data)
|
||||||
|
else
|
||||||
|
_reuse.push(consume data)
|
||||||
|
end
|
||||||
|
until _output.size() == 0 end
|
||||||
|
end
|
||||||
|
|
||||||
|
if iterate > 1 then
|
||||||
|
apply(iterate - 1)
|
||||||
|
else
|
||||||
|
_main.done()
|
||||||
|
end
|
||||||
|
|
||||||
|
be receive(data: Array[U64] iso) =>
|
||||||
|
try
|
||||||
|
for i in Range(0, data.size()) do
|
||||||
|
let datum = data(i)
|
||||||
|
var j = (datum >> _loglocal) and _mask
|
||||||
|
_table(j) = _table(j) xor datum
|
||||||
|
end
|
||||||
|
|
||||||
|
data.clear()
|
||||||
|
_reuse.push(consume data)
|
||||||
|
end
|
||||||
|
|
||||||
|
be done() =>
|
||||||
|
_main.confirm()
|
||||||
|
|
||||||
|
primitive PolyRand
|
||||||
|
fun apply(prev: U64): U64 =>
|
||||||
|
(prev << 1) xor if prev.i64() < 0 then _poly() else 0 end
|
||||||
|
|
||||||
|
fun seed(from: U64): U64 =>
|
||||||
|
var n = from % _period()
|
||||||
|
|
||||||
|
if n == 0 then
|
||||||
|
return 1
|
||||||
|
end
|
||||||
|
|
||||||
|
var m2 = Array[U64].undefined(64)
|
||||||
|
var temp = U64(1)
|
||||||
|
|
||||||
|
try
|
||||||
|
for i in Range(0, 64) do
|
||||||
|
m2(i) = temp
|
||||||
|
temp = this(temp)
|
||||||
|
temp = this(temp)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
var i: U64 = 64 - n.clz()
|
||||||
|
var r = U64(2)
|
||||||
|
|
||||||
|
try
|
||||||
|
while i > 0 do
|
||||||
|
temp = 0
|
||||||
|
|
||||||
|
for j in Range(0, 64) do
|
||||||
|
if ((r >> j) and 1) != 0 then
|
||||||
|
temp = temp xor m2(j)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
r = temp
|
||||||
|
i = i - 1
|
||||||
|
|
||||||
|
if ((n >> i) and 1) != 0 then
|
||||||
|
r = this(r)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
r
|
||||||
|
|
||||||
|
fun _poly(): U64 => 7
|
||||||
|
|
||||||
|
fun _period(): U64 => 1317624576693539401
|
||||||
3
samples/Pony/hello-world.pony
Normal file
3
samples/Pony/hello-world.pony
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
actor Main
|
||||||
|
new create(env: Env) =>
|
||||||
|
env.out.print("Hello, world.")
|
||||||
188
samples/Pony/mandelbrot.pony
Normal file
188
samples/Pony/mandelbrot.pony
Normal file
@@ -0,0 +1,188 @@
|
|||||||
|
use "files"
|
||||||
|
use "options"
|
||||||
|
use "collections"
|
||||||
|
|
||||||
|
actor Worker
|
||||||
|
new mandelbrot(main: Main, x: U64, y: U64, width: U64, iterations: U64,
|
||||||
|
limit: F32, real: Array[F32] val, imaginary: Array[F32] val)
|
||||||
|
=>
|
||||||
|
var view: Array[U8] iso =
|
||||||
|
recover
|
||||||
|
Array[U8]((y - x) * (width >> 3))
|
||||||
|
end
|
||||||
|
|
||||||
|
let group_r = Array[F32].undefined(8)
|
||||||
|
let group_i = Array[F32].undefined(8)
|
||||||
|
|
||||||
|
var row = x
|
||||||
|
|
||||||
|
try
|
||||||
|
while row < y do
|
||||||
|
let prefetch_i = imaginary(row)
|
||||||
|
|
||||||
|
var col: U64 = 0
|
||||||
|
|
||||||
|
while col < width do
|
||||||
|
var j: U64 = 0
|
||||||
|
|
||||||
|
while j < 8 do
|
||||||
|
group_r.update(j, real(col + j))
|
||||||
|
group_i.update(j, prefetch_i)
|
||||||
|
j = j + 1
|
||||||
|
end
|
||||||
|
|
||||||
|
var bitmap: U8 = 0xFF
|
||||||
|
var n = iterations
|
||||||
|
|
||||||
|
repeat
|
||||||
|
var mask: U8 = 0x80
|
||||||
|
var k: U64 = 0
|
||||||
|
|
||||||
|
while k < 8 do
|
||||||
|
let r = group_r(k)
|
||||||
|
let i = group_i(k)
|
||||||
|
|
||||||
|
group_r.update(k, ((r * r) - (i * i)) + real(col + k))
|
||||||
|
group_i.update(k, (2.0 * r * i) + prefetch_i)
|
||||||
|
|
||||||
|
if ((r * r) + (i * i)) > limit then
|
||||||
|
bitmap = bitmap and not mask
|
||||||
|
end
|
||||||
|
|
||||||
|
mask = mask >> 1
|
||||||
|
k = k + 1
|
||||||
|
end
|
||||||
|
until (bitmap == 0) or ((n = n - 1) == 1) end
|
||||||
|
|
||||||
|
view.push(bitmap)
|
||||||
|
|
||||||
|
col = col + 8
|
||||||
|
end
|
||||||
|
row = row + 1
|
||||||
|
end
|
||||||
|
|
||||||
|
main.draw(x * (width >> 3), consume view)
|
||||||
|
end
|
||||||
|
|
||||||
|
actor Main
|
||||||
|
var iterations: U64 = 50
|
||||||
|
var limit: F32 = 4.0
|
||||||
|
var chunks: U64 = 16
|
||||||
|
var width: U64 = 16000
|
||||||
|
var actors: U64 = 0
|
||||||
|
var header: U64 = 0
|
||||||
|
var real: Array[F32] val = recover Array[F32] end
|
||||||
|
var imaginary: Array[F32] val = recover Array[F32] end
|
||||||
|
var outfile: (File | None) = None
|
||||||
|
|
||||||
|
new create(env: Env) =>
|
||||||
|
try
|
||||||
|
arguments(env)
|
||||||
|
|
||||||
|
let length = width
|
||||||
|
let recip_width = 2.0 / width.f32()
|
||||||
|
|
||||||
|
var r = recover Array[F32](length) end
|
||||||
|
var i = recover Array[F32](length) end
|
||||||
|
|
||||||
|
for j in Range(0, width) do
|
||||||
|
r.push((recip_width * j.f32()) - 1.5)
|
||||||
|
i.push((recip_width * j.f32()) - 1.0)
|
||||||
|
end
|
||||||
|
|
||||||
|
real = consume r
|
||||||
|
imaginary = consume i
|
||||||
|
|
||||||
|
spawn_actors()
|
||||||
|
create_outfile()
|
||||||
|
end
|
||||||
|
|
||||||
|
be draw(offset: U64, pixels: Array[U8] val) =>
|
||||||
|
match outfile
|
||||||
|
| var out: File =>
|
||||||
|
out.seek_start(header + offset)
|
||||||
|
out.write(pixels)
|
||||||
|
if (actors = actors - 1) == 1 then
|
||||||
|
out.dispose()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
fun ref create_outfile() =>
|
||||||
|
match outfile
|
||||||
|
| var f: File =>
|
||||||
|
f.print("P4\n " + width.string() + " " + width.string() + "\n")
|
||||||
|
header = f.size()
|
||||||
|
f.set_length((width * (width >> 3)) + header)
|
||||||
|
end
|
||||||
|
|
||||||
|
fun ref spawn_actors() =>
|
||||||
|
actors = ((width + (chunks - 1)) / chunks)
|
||||||
|
|
||||||
|
var rest = width % chunks
|
||||||
|
|
||||||
|
if rest == 0 then rest = chunks end
|
||||||
|
|
||||||
|
var x: U64 = 0
|
||||||
|
var y: U64 = 0
|
||||||
|
|
||||||
|
for i in Range(0, actors - 1) do
|
||||||
|
x = i * chunks
|
||||||
|
y = x + chunks
|
||||||
|
Worker.mandelbrot(this, x, y, width, iterations, limit, real, imaginary)
|
||||||
|
end
|
||||||
|
|
||||||
|
Worker.mandelbrot(this, y, y + rest, width, iterations, limit, real,
|
||||||
|
imaginary)
|
||||||
|
|
||||||
|
fun ref arguments(env: Env) ? =>
|
||||||
|
let options = Options(env)
|
||||||
|
|
||||||
|
options
|
||||||
|
.add("iterations", "i", I64Argument)
|
||||||
|
.add("limit", "l", F64Argument)
|
||||||
|
.add("chunks", "c", I64Argument)
|
||||||
|
.add("width", "w", I64Argument)
|
||||||
|
.add("output", "o", StringArgument)
|
||||||
|
|
||||||
|
for option in options do
|
||||||
|
match option
|
||||||
|
| ("iterations", var arg: I64) => iterations = arg.u64()
|
||||||
|
| ("limit", var arg: F64) => limit = arg.f32()
|
||||||
|
| ("chunks", var arg: I64) => chunks = arg.u64()
|
||||||
|
| ("width", var arg: I64) => width = arg.u64()
|
||||||
|
| ("output", var arg: String) =>
|
||||||
|
outfile = try File(FilePath(env.root, arg)) end
|
||||||
|
| let err: ParseError => err.report(env.out) ; usage(env) ; error
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
fun tag usage(env: Env) =>
|
||||||
|
env.out.print(
|
||||||
|
"""
|
||||||
|
mandelbrot [OPTIONS]
|
||||||
|
|
||||||
|
The binary output can be converted to a BMP with the following command
|
||||||
|
(ImageMagick Tools required):
|
||||||
|
|
||||||
|
convert <output> JPEG:<output>.jpg
|
||||||
|
|
||||||
|
Available options:
|
||||||
|
|
||||||
|
--iterations, -i Maximum amount of iterations to be done for each pixel.
|
||||||
|
Defaults to 50.
|
||||||
|
|
||||||
|
--limit, -l Square of the limit that pixels need to exceed in order
|
||||||
|
to escape from the Mandelbrot set.
|
||||||
|
Defaults to 4.0.
|
||||||
|
|
||||||
|
--chunks, -c Maximum line count of chunks the image should be
|
||||||
|
divided into for divide & conquer processing.
|
||||||
|
Defaults to 16.
|
||||||
|
|
||||||
|
--width, -w Lateral length of the resulting mandelbrot image.
|
||||||
|
Defaults to 16000.
|
||||||
|
|
||||||
|
--output, -o File to write the output to.
|
||||||
|
|
||||||
|
"""
|
||||||
|
)
|
||||||
130
samples/Pony/mixed.pony
Normal file
130
samples/Pony/mixed.pony
Normal file
@@ -0,0 +1,130 @@
|
|||||||
|
use "collections"
|
||||||
|
|
||||||
|
actor Worker
|
||||||
|
var _env: Env
|
||||||
|
|
||||||
|
new create(env: Env) =>
|
||||||
|
_env = env
|
||||||
|
|
||||||
|
var a: U64 = 86028157
|
||||||
|
var b: U64 = 329545133
|
||||||
|
|
||||||
|
var result = factorize(a*b)
|
||||||
|
|
||||||
|
var correct =
|
||||||
|
try
|
||||||
|
(result.size() == 2) and
|
||||||
|
(result(0) == 86028157) and
|
||||||
|
(result(1) == 329545133)
|
||||||
|
else
|
||||||
|
false
|
||||||
|
end
|
||||||
|
|
||||||
|
fun ref factorize(bigint: U64) : Array[U64] =>
|
||||||
|
var factors = Array[U64](2)
|
||||||
|
|
||||||
|
if bigint <= 3 then
|
||||||
|
factors.push(bigint)
|
||||||
|
else
|
||||||
|
var d: U64 = 2
|
||||||
|
var i: U64 = 0
|
||||||
|
var n = bigint
|
||||||
|
|
||||||
|
while d < n do
|
||||||
|
if (n % d) == 0 then
|
||||||
|
i = i + 1
|
||||||
|
factors.push(d)
|
||||||
|
n = n / d
|
||||||
|
else
|
||||||
|
d = if d == 2 then 3 else (d + 2) end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
factors.push(d)
|
||||||
|
end
|
||||||
|
|
||||||
|
factors
|
||||||
|
|
||||||
|
actor Ring
|
||||||
|
var _env: Env
|
||||||
|
var _size: U32
|
||||||
|
var _pass: U32
|
||||||
|
var _repetitions: U32
|
||||||
|
var _next: Ring
|
||||||
|
|
||||||
|
new create(env: Env, size: U32, pass: U32, repetitions: U32) =>
|
||||||
|
_env = env
|
||||||
|
_size = size
|
||||||
|
_pass = pass
|
||||||
|
_repetitions = repetitions
|
||||||
|
_next = spawn_ring(_env, _size, _pass)
|
||||||
|
run()
|
||||||
|
|
||||||
|
new neighbor(env: Env, next: Ring) =>
|
||||||
|
_env = env
|
||||||
|
_next = next
|
||||||
|
_size = 0
|
||||||
|
_pass = 0
|
||||||
|
_repetitions = 0
|
||||||
|
|
||||||
|
be apply(i: U32) =>
|
||||||
|
if i > 0 then
|
||||||
|
_next(i - 1)
|
||||||
|
else
|
||||||
|
run()
|
||||||
|
end
|
||||||
|
|
||||||
|
fun ref run() =>
|
||||||
|
if _repetitions > 0 then
|
||||||
|
_repetitions = _repetitions - 1
|
||||||
|
_next(_pass * _size)
|
||||||
|
Worker(_env)
|
||||||
|
end
|
||||||
|
|
||||||
|
fun tag spawn_ring(env: Env, size: U32, pass': U32) : Ring =>
|
||||||
|
var next: Ring = this
|
||||||
|
|
||||||
|
for i in Range[U32](0, size) do
|
||||||
|
next = Ring.neighbor(env, next)
|
||||||
|
end
|
||||||
|
|
||||||
|
next
|
||||||
|
|
||||||
|
actor Main
|
||||||
|
var _size: U32 = 50
|
||||||
|
var _count: U32 = 20
|
||||||
|
var _pass: U32 = 10000
|
||||||
|
var _repetitions: U32 = 5
|
||||||
|
var _env: Env
|
||||||
|
|
||||||
|
new create(env: Env) =>
|
||||||
|
_env = env
|
||||||
|
|
||||||
|
try
|
||||||
|
arguments()
|
||||||
|
start_benchmark()
|
||||||
|
else
|
||||||
|
usage()
|
||||||
|
end
|
||||||
|
|
||||||
|
fun ref arguments() ? =>
|
||||||
|
_count = _env.args(1).u32()
|
||||||
|
_size = _env.args(2).u32()
|
||||||
|
_pass = _env.args(3).u32()
|
||||||
|
_repetitions = _env.args(4).u32()
|
||||||
|
|
||||||
|
fun ref start_benchmark() =>
|
||||||
|
for i in Range[U32](0, _count) do
|
||||||
|
Ring(_env, _size, _pass, _repetitions)
|
||||||
|
end
|
||||||
|
|
||||||
|
fun ref usage() =>
|
||||||
|
_env.out.print(
|
||||||
|
"""
|
||||||
|
mixed OPTIONS
|
||||||
|
N number of actors in each ring"
|
||||||
|
N number of rings"
|
||||||
|
N number of messages to pass around each ring"
|
||||||
|
N number of times to repeat"
|
||||||
|
"""
|
||||||
|
)
|
||||||
1
vendor/grammars/sublime-pony
vendored
Submodule
1
vendor/grammars/sublime-pony
vendored
Submodule
Submodule vendor/grammars/sublime-pony added at 6197c4028e
Reference in New Issue
Block a user