了解Racket中的列表迭代和函数调用

时间:2018-12-12 00:28:30

标签: racket

我正在尝试使用Racket实现类似于prolog的程序。我对这门语言还是很陌生。我能够编写下面的=or函数中看到的=and===parent,但是我在query和考虑到我的初学者对语言的重视程度,我觉得这是一个基本的误会。

这是父函数:

(define (=parent x y)
   (=or (=and (== x "Cronus") (== y "Zeus"))
        (=and (== x "Zeus") (== y "Athena"))
        (=and (== x "Athena") (== y "Erichthonius"))))

这是预期的用途:

(query (option) (=parent "Zeus" option))

...当optionAthena时将成功。

我已经给它做了许多不同的尝试,但是总是得到错误的输出和行为。最初,我尝试使用let的本地绑定,但我对其进行了进一步简化,但仍然无法使用:

(define query
  (lambda (arg1 arg2)
    (for/list ([i (in-list arg1)])
      (ormap (λ (x) arg2 x) i))))

我还采用了这样定义option的方法:

(define (option)
  (list '(Zeus Athena Erichthonius Cronus)))

如上所述运行查询代码始终会得到'(Zeus)的输出。

在调试器中,当我在for/list行上设置断点时,我看到i => (Zeus Athena Erichthonius Cronus)iquery返回之前从未改变。我以为我编写的代码会遍历列表,为每个元素分配i,但事实并非如此。那我哪里出问题了?

此外,在调试器的每一步中,我都不会输入(=parent x y)函数。而且我不明白为什么它没有被调用。

我的最后一个问题:为什么我不能使用option的字符串来定义list? (它产生:ormap:违反合同,预期:清单?给出:“宙斯”

(define (option)
  (list "Zeus" "Athena" "Erichthonius" "Cronus"))

0 个答案:

没有答案