标签: ponylang

使用Ponylang的无锁模型无法实现哪些结构?

Ponylang是一种无锁且无数据访问的新语言.我的印象是,为了实现这一点,Ponylang查看句子"如果两个线程可以看到相同的对象,则写入必须禁止另一个线程的任何其他操作",并使用类型系统来强制执行各种特殊情况.例如,有一个类型描述符,说"没有其他线程可以看到这个对象",并且有一个说"这个引用是只读的",以及其他各种.不可否认,我对此的理解非常差,而ponylang的文档缺少示例.

我的问题是:是否可以使用基于锁的语言进行操作,而这些语言根本无法转换为ponylang的基于类型的系统?此外,是否有这样的操作不能翻译成ponylang中的有效结构?

multithreading ponylang

17
推荐指数
1
解决办法
830
查看次数

如何在Pony中将值强制转换为String?

我正在努力学习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.很好,但我怎么得到其中一个?

ponylang

6
推荐指数
1
解决办法
655
查看次数

ponylang-我不知道如何转换类型

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 …

ponylang

5
推荐指数
1
解决办法
736
查看次数

为 Pony 数组实现 map 函数

我一直在玩 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)

ponylang

5
推荐指数
1
解决办法
181
查看次数

数据竞争?或者其他什么问题?

今天就找到了编程语言"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)

ponylang

4
推荐指数
1
解决办法
157
查看次数

是否可以修改函数参数?(如 C++ 中的 &)

 actor Test
     fun foo(a: U32) =>
        a = a + 1
Run Code Online (Sandbox Code Playgroud)

我想test.foo(a)修改a. 这可能吗?谢谢

ponylang

4
推荐指数
1
解决办法
94
查看次数

区分 Pony 中不同类型的错误?

Pony 有一个未参数化的异常值。

不幸的是,我经常有代码想要抛出不同类型的异常,我需要知道它们是什么以便正确处理它们——例如,简单地说,当停止程序时,向用户提供正确的错误消息很重要!

那么在 Pony 中这样做的惯用方法是什么?

ponylang

3
推荐指数
1
解决办法
249
查看次数

用 actor 替换 class 关键字会导致错误

这是我的代码:

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为,则会出现一堆错误:actorEapproximator

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)

class actor ponylang

3
推荐指数
1
解决办法
127
查看次数

标签 统计

ponylang ×8

actor ×1

class ×1

multithreading ×1