【问题标题】:Common lisp exercise , assing a value to string常见的lisp练习,给字符串赋值
【发布时间】:2020-02-09 13:52:39
【问题描述】:

我一直在研究这个问题,“做一个给定两个月的函数,说如果第一个月出现在日历打印中的第二个月之前是真的”。我只能使用 , cons, append, list, equal, defun, car, cdr, cond , T , NIL

尽管最好的方法是为每个月份分配一个值,并制作单独的函数,一个函数用于月份,另一个函数用于验证月份。

这是我的代码:我不会粘贴所有代码,因为我仍在测试: 我是这样做的,不确定我是否为月份分配了正确的值,导致我不确定如何为字符串赋值。

 (defun months(month)
             (cond ((null month)0)
                   ((= month (format t "january") 1))
                    ((= month (format t "february") 2))
                             nil ))

    the other function:

    (defun check-month(month1 month2)
        (if (< (months month1) (months month2))
            T
            NIL
        )   
    )

and when I called the function check-month it says:

 (check-month "january" "february")

*** - IF: variable months has no value


The actual result should be like this: 
  (check-month “january” ”february”)
      T

【问题讨论】:

  • 问题陈述中没有对字符串的引用,你确定你没有让这变得比必要的更困难吗?
  • 您的代码出现了一堆基本错误。这本书可能有助于学习 Lisp 的基础知识:cs.cmu.edu/~dst/LispBook 你可以从那里下载 PDF。

标签: lisp common-lisp


【解决方案1】:

这不是代码形式的答案,因为我不想为你做作业。

首先:您提到的错误显然来自一些代码,而不是您问题中的代码:实际检查您认为正在检查的代码总是一个好主意。 p>

其次,(if (f ...) t nil) 这样的表达式有什么作用?唯一有用的目的是如果您想将(f ...) 的返回值规范化为t 或nil。但是(equal a b) 会返回什么?

其次:如果你真的只有允许使用cons、append、list、equal、defun、car、cdr、@987654333 @t 和nil 那么您不允许使用&lt; 或= 或您使用过的许多其他函数和其他运算符。所以你有一个有趣的问题要解决。

解决它的一种方法是编写一个名为first-in-list 的函数:这​​需要三个参数,这是它的规范:

(first-in-list a b l) 返回a 或b 中的第一个在l 中,与equal 或nil 相比,如果它们都不是(如果@987654345 返回什么取决于你) @ 和 b 是一样的)。

您可以使用 cond、car、cdr、equal、nil、t 和一个名为 first-in-list 的辅助函数来编写此函数。

现在您可以编写一个函数month-before-p,它接受两个参数ma 和mb 和:

  • 检查ma 是否等于mb,如果是则返回nil(这避免了first-in-list 规范中的歧义;
  • 检查(first-in-list ma mb (list "january" ....))是否等于ma或mb;
  • 对于附加值可以检查调用first-in-list的结果是否为nil,这是一个错误。

这个函数也可以用cond、equal、t和nil编写,以及你已经编写的辅助函数first-in-list。

【讨论】:

  • 感谢回复,我真正想知道的是给字符串变量赋值的正确方法。
  • 鉴于您不允许使用任何您不能使用的赋值操作(即使“字符串变量”一开始就有意义)。
【解决方案2】:

Format 输出东西。那里没有意义。此外,它不在您可以使用的运算符列表中。

= 比较数字。字符串不是数字。此外,它不在您允许使用的运算符列表中。从该列表中,使用equal 来确定相等性。

这应该回答您最初的问题(但“assing”不是英文单词)。

但是,&lt; 不在您可以使用的运算符列表中,因此将字符串转换为数字对您没有用处。

相反,我建议如下:给定一个列表("january" "february" "march" …),编写一个函数,该函数采用月份名称并返回从该月份开始的列表的其余部分。然后用第一个月的名字调用它,并检查第二个是否包含在返回值中。

提示:在标准的、不受约束的 Lisp 中,它可能如下所示:(member month-b (member month-a months :test #'equal) :test #'equal))。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-24
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 2012-12-10
    • 2015-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多