小编use*_*428的帖子

设置的车!并用计划语言

我对这个例子的结果有点困惑:

(define mk-q
  (lambda ()
    (let ([l '(x)])
      (cons l l))))


(define q (mk-q))

q
=> ((x) x)

(set-car! (cdr q) 'y)
=> ((y) y)
Run Code Online (Sandbox Code Playgroud)

我想知道为什么两个x原子都被set-car!程序所取代(我对结果的第一个猜测是什么((x) y))?

例如:

(define mk-q2
  (lambda ()
    (let ([l '(x)])
      (cons l (cons l l)))))

(define q2 (mk-q2))
(set-car! (cdr q2) 'y)
=> ((x) y x) which fits my understanding of set-car!
Run Code Online (Sandbox Code Playgroud)

为什么x第一个例子中的两个都被替换了?

lisp scheme racket mit-scheme

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

golang测试命令行参数

我想测试传递给我的CLI程序的其他(正确/不正确)命令行参数,但是由于flag redefined出现错误,我不确定如何使用go / testing包实现此功能。好像发生了,因为flag.Parse()只能被调用一次。测试传递给go程序的不同命令行参数的正确方法是什么?有什么办法可以定义类似的东西setup()/teardown()或单独运行每种情况(但在同一文件中)?

这是我的代码:

测试功能:

func (p *Params) Parse() (*Params, error) {
        param1Ptr := flag.String("param1", "default", "param1 desc")
        param2Ptr := flag.String("param2", "default", "param1 desc")
        ...
        ... 
        flag.Parse()
        ...

}
Run Code Online (Sandbox Code Playgroud)

测试文件:

包主

import (
        "os"
        "testing"
)


func TestParam1(t *testing.T) {
        os.Args = []string{"cmd", "-param1", "incorrect", "-param2", "correct"}
        params := Params{}
        _, err := params.Parse()
        ...
        ... 
}

func TestParam2(t *testing.T) {
        os.Args = []string{"cmd", "-param1", "correct", "-param2", "incorrect"}
        params := Params{}
        _, err …
Run Code Online (Sandbox Code Playgroud)

go

2
推荐指数
1
解决办法
1387
查看次数

函数体内具有模式匹配的宏

假设我们有 2 个结构:

defmodule Algo.A do
  defstruct id: nil, foo: nil
end

defmodule Algo.B do
  defstruct id: nil, bar: nil
end
Run Code Online (Sandbox Code Playgroud)

以及以下按结构类型过滤的 API:

defmodule Algo do
  alias Algo.{A, B}

  def filter_by_type(collection, %A{}) do
    for %A{} = el <- collection, do: el
  end

  def filter_by_type(collection, %B{}) do
    for %B{} = el <- collection, do: el
  end
end
Run Code Online (Sandbox Code Playgroud)

预期的行为只是根据理解中的匹配返回一个集合:

    test "filters by struct type" do
      collection = [%A{id: 1}, %A{id: 2}, %B{id: 3}]
      assert [%A{id: 1}, %A{id: 2}] = Algo.filter_by_type(collection, %A{})
      assert …
Run Code Online (Sandbox Code Playgroud)

elixir

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

标签 统计

elixir ×1

go ×1

lisp ×1

mit-scheme ×1

racket ×1

scheme ×1