【问题标题】:Scheme program as a list of symbols作为符号列表的方案程序
【发布时间】:2018-07-19 07:31:44
【问题描述】:

我必须将整个方案程序作为列表传递给我的用户定义函数/谓词“is-s-list?”它标识作为列表传递的方案程序是否是符号列表。

但是,我不明白如何将方案程序作为列表...?

我试过这个:

(define P '())  ....i.e a null list
(append P "my entire program")

现在,我在函数 "is-s-list?" 中执行 car/cdr 时遇到了一些问题

我应该如何分析程序的组件以确定程序是否是符号列表?而且,一个程序真的只是一个方案符号的列表吗?那么在使用 (symbol? (car P)) 的检查结束后我应该返回#f 吗?

我想做的是这样的:

在像 scheme 这样的语言中,我们将代码表示为符号列表。

写一个谓词“is-s-list?”它将另一个程序作为一个列表,如果它是一个符号列表,则返回 true。

【问题讨论】:

  • 方案中的所有内容都是一个列表。 “符号列表”是什么意思?
  • 准确一点。 13 不是列表。 "abc" 不是列表。
  • 我认为我们需要更多的上下文。我猜您正在学习编程语言课程,并且您的讲师正在选择使用“引用”的功能将带括号的字符串转换为列表。我进一步猜测您被要求编写一个函数来确定任意值是否是字符串列表。这一切都正确吗?
  • 如果你使用'引用你的程序,除非你在上面调用eval,否则它不会执行,但认为一些列表数据与'(ab(de))没有太大区别。
  • 在 MIT-scheme 中:如果你定义了一个类似的表达式(定义一个'(.....)),那么如果解释器接受“定义”,那么 a 将是一个正确的列表 -表达。除了数字、字符串和#f、#t 和'() 之外,任何不是对的东西都将是符号。现在:你能举一个“is-s-list”的例子吗?将返回“#f”?

标签: scheme guile


【解决方案1】:

Lisp 表达式是一种树状结构 所以你必须解析某种二叉树 以下链接可能对您有所帮助

S-expr

【讨论】:

    【解决方案2】:

    这是一个一个表达式

    的Scheme程序
    (begin
      (define a 10)
      (define b 13)
      (define (square n)
        (* n n))
      (+ (square a) (square b)))
    ; ==> 269
    

    这里是和data一样的程序,绑定到变量code

    (define code 
      '(begin
         (define a 10)
         (define b 13)
         (define (square n)
           (* n n))
         (+ (square a) (square b))))
    
    code ; ==> (begin ....) (a list of symbols and the occational number)
    

    主要区别在于' 将后面的表达式更改为数据而不是代码。在许多其他编程语言中,eval 采用字符串,因为它们没有定义数据类型来将代码表示为数据。这主要是 LISP 功能。

    【讨论】:

    • 谢谢....这就是我一直在寻找的东西....但是我需要更多帮助...现在我将这个变量“代码”作为我的函数的输入“是-symbolic-list?”,像这样:“is-symbolic-list?code” .... 在函数中,当我这样做(汽车代码)时,我得到第一个符号“begin” ....然后我将(cdr 代码)再次传递给函数以在递归调用中将(cdr 代码)重新分配给代码......这次当我这样做时(汽车代码),它给了我“定义一个 10”,它出来打印# f 因为它不是一个符号......这是正确的吗?
    • @HarshadaKelkar 一个 Scheme 程序可以只是一个由仅包含符号的列表组成的表达式,但大多数情况下你有像我的示例中的子表达式,其中 (define ...) 是程序列表中的一个列表。如果允许,那么is-symbolic-list? 需要支持列表可以由符号或is-symbolic-list? 为真的列表组成。 eval 做了类似的事情。 (+ 1 2) 可以,(* (+ 1 2) (+ 1 2)) 也可以,因为您有符号 + 和两个“程序”作为参数。现在“程序”只是 Scheme 表达式
    猜你喜欢
    • 1970-01-01
    • 2018-06-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-24
    相关资源
    最近更新 更多