Ponylang是一种无锁且无数据访问的新语言.我的印象是,为了实现这一点,Ponylang查看句子"如果两个线程可以看到相同的对象,则写入必须禁止另一个线程的任何其他操作",并使用类型系统来强制执行各种特殊情况.例如,有一个类型描述符,说"没有其他线程可以看到这个对象",并且有一个说"这个引用是只读的",以及其他各种.不可否认,我对此的理解非常差,而ponylang的文档缺少示例.
我的问题是:是否可以使用基于锁的语言进行操作,而这些语言根本无法转换为ponylang的基于类型的系统?此外,是否有这样的操作不能翻译成ponylang中的有效结构?
我正在努力学习Pony,并且由于显而易见的原因,我想要做的第一件事就是打印值.
但是,它似乎对大多数事情都不起作用,例如:
env.out.print(2 + 2)
Run Code Online (Sandbox Code Playgroud)
给出错误:
Could not infer literal type, no valid types found
Run Code Online (Sandbox Code Playgroud)
我也尝试过:
let four: U32 = 2 + 2
env.out.print(four)
Run Code Online (Sandbox Code Playgroud)
但是这给出了一个更加丑陋的错误,说我需要一些属于它的子类型ByteSeq
.很好,但我怎么得到其中一个?
从helloworld开始,我试图通过制作一个应用程序向我学习一些小马,该应用程序会回显用户输入的内容。除了行I之外,这行得通_env.out.print(_buffer)
。
class MyInput iso is StdinNotify
var _env: Env
var _buffer: Array[U8]
new iso create(env: Env) =>
_env = env
_buffer = Array[U8].create()
fun ref apply(data: Array[U8] iso) =>
for item in (consume data).values() do
if item == 0x0A then
_env.out.print(_buffer)
_buffer = Array[U8].create()
end
_buffer.push(item)
end
Run Code Online (Sandbox Code Playgroud)
我得到的编译错误是:
argument not a subtype of parameter
_env.out.print(_buffer)
^
parameter type: ByteSeq val
be print(data: ByteSeq) =>
^
argument type: Array[U8 val] ref
_env.out.print(_buffer)
Run Code Online (Sandbox Code Playgroud)
通过阅读github中的源代码,我认为 Array …
我一直在玩 Pony 数组,以便更好地理解 Pony,并且想为任何数组编写映射函数。
我说的是现在大多数语言都具有的用于转换集合元素的标准映射函数,如 Clojure 中所示:
(map #(+ 1 %) [1 2 3]) ; => [2 3 4]
Run Code Online (Sandbox Code Playgroud)
但我希望它实际修改给定的数组,而不是返回新的数组。
到目前为止,我当前的尝试由于功能而遇到了许多错误:
// array is "iso" so I can give it to another actor and change it
let my_array: Array[U64] iso = [1; 2; 3; 4]
// other actor tries to recover arrays as "box" just to call pairs() on it
let a = recover box my_array end // ERROR: can't recover to this capability
for (i, item) in a.pairs() do …
Run Code Online (Sandbox Code Playgroud) 今天就找到了编程语言"pony"......并开始玩它.
我的代码应该做一些简单的生产者消费者的事情.正如语言文档所声称的,该语言确保没有数据竞争.
这里,main向生产者发送10条消息,生产者又向消费者发送10条消息.消费者递增计数器状态变量.然后,main向消费者发送消息,消费者又向main发送消息以显示当前值.如果所有消息都按顺序排列,则预期值将为9(或10).打印结果虽然是0.
因为这是我用语言玩的第一个小时,当然我可能搞砸了别的东西.
谁可以解释我的错误?
use "collections"
actor Consumer
var _received : I32
new create() =>
_received = 0
be tick() =>
_received = _received + 1
be query(main : Main) =>
main.status(_received)
actor Producer
var _consumer : Consumer
new create(consumer' : Consumer) =>
_consumer = consumer'
be produceOne () =>
_consumer.tick()
actor Main
var _env : Env
new create(env: Env) =>
_env = env
let c : Consumer = Consumer.create()
let p = Producer.create(c)
for i in Range[I32](0,10) do …
Run Code Online (Sandbox Code Playgroud) actor Test
fun foo(a: U32) =>
a = a + 1
Run Code Online (Sandbox Code Playgroud)
我想test.foo(a)
修改a
. 这可能吗?谢谢
Pony 有一个未参数化的异常值。
不幸的是,我经常有代码想要抛出不同类型的异常,我需要知道它们是什么以便正确处理它们——例如,简单地说,当停止程序时,向用户提供正确的错误消息很重要!
那么在 Pony 中这样做的惯用方法是什么?
这是我的代码:
class Eapproximator
var step : F64
new create(step' :F64) =>
step = step'
fun evaluate() :F64 =>
var total = F64(0)
var value = F64(1)
while total < 1 do
total = total + step
value = value + (value * step)
end
value
actor Main
new create(env: Env) =>
var e_approx = Eapproximator(0.00001)
var e_val = e_approx.evaluate()
env.out.print(e_val.string())
Run Code Online (Sandbox Code Playgroud)
它运行良好并打印(如预期)2.7183。但是,如果我在定义中替换class
为,则会出现一堆错误:actor
Eapproximator
Error:
/src/main/main.pony:18:34: receiver type is not a subtype of target type
var e_val = e_approx.evaluate() …
Run Code Online (Sandbox Code Playgroud)