Common lisp 口齿不清:条件句有问题吗

Common lisp 口齿不清:条件句有问题吗,common-lisp,Common Lisp,嘿,伙计们,我刚开始在我的大学里学习Lisp,但是教授非常穷,他自己似乎不懂这门语言,所以我求助于你们大家。我对Java非常有经验,在将Java的条件语句与Lisp关联起来时遇到了困难。这是我被要求解决的问题 写一个函数,计算乘客的年龄和两个城市之间的机票金额。如果孩子小于2岁,机票价格为0,在2到5岁之间,机票价格为全额票价的60%。如果孩子大于等于5岁,机票价格为全额票价 这是我的解决方案,但我觉得这是低效的 (defun young-child(x y) (cond

嘿,伙计们,我刚开始在我的大学里学习Lisp,但是教授非常穷,他自己似乎不懂这门语言,所以我求助于你们大家。我对Java非常有经验,在将Java的条件语句与Lisp关联起来时遇到了困难。这是我被要求解决的问题

写一个函数,计算乘客的年龄和两个城市之间的机票金额。如果孩子小于2岁,机票价格为0,在2到5岁之间,机票价格为全额票价的60%。如果孩子大于等于5岁,机票价格为全额票价

这是我的解决方案,但我觉得这是低效的

(defun young-child(x y)
        (cond
          ((< x 2) 0)
          ((= x 2) (* y .6))
          ((= x 3) (* y .6))
          ((= x 4) (* y .6))
          ((= x 5) (* y .6))
          ((> x 5) y)))
(德芬幼儿(x y)
(续)
(x5)y)))
现在在Java中,我只会说

如果(x>=2&&x=<5){
返回y*.6
}
else如果(x<2){
返回0;
}
否则{
返回y;
}

我要问的是:有没有更好的方法来编写Lisp条件语句?如果我必须检查更大范围的年龄,那么使用这种方法代码将变得极其乏味。在Lisp中是否有一种方法可以像我在Java中做的那样检查一个if语句中的两个条件?非常感谢您查看此代码以及以后的任何回复

Lisp有一个
操作符,可用于组合多个条件

(defun young-child (x y)
  (cond ((and (>= x 2) (<= x 5)) (* y .6))
        ((< x 2) 0)
        (t y)))

Lisp有一个和运算符,可用于组合多个条件

(defun young-child (x y)
  (cond ((and (>= x 2) (<= x 5)) (* y .6))
        ((< x 2) 0)
        (t y)))
也可能:

(defun young-child (age fare) 
  (* (con ((< age 2) 0) 
          ((< age 5) .6)
          (t 1)) 
     fare)
(德芬幼儿(年龄)
(*(con(<2岁)0)
(<5岁)。6)
(t 1)
车费)
函数式编程使之成为可能:)。

也可能:

(defun young-child (age fare) 
  (* (con ((< age 2) 0) 
          ((< age 5) .6)
          (t 1)) 
     fare)
(德芬幼儿(年龄)
(*(con(<2岁)0)
(<5岁)。6)
(t 1)
车费)

函数式编程使之成为可能:)。

为什么您认为Lisp没有一个与Java的
&&
相对应的运算符?我只是不确定,因为它们是不同的范例。我还并没有使用函数范式的经验,仅仅用Lisp编写代码一周。我想问问也没什么坏处。感谢您的回复。这是学习Lisp的一个有趣的方法:只是一个说明:为了可读性,即使在Java中,您可能更喜欢
2为什么您认为Lisp没有与Java的
&&
对应的运算符?我只是不确定,因为它们是不同的范例。我还并没有使用函数范式的经验,仅仅用Lisp编写代码一周。我想问问也没什么坏处。感谢您的回复。这是一个学习Lisp的有趣方法:只是一个提示:为了可读性,即使是在Java中,您可能更喜欢
2嘿,非常感谢您发布这篇文章。这是难以置信的信息。我的一个小问题是,你在条件句末尾放的(y)是什么?对不起,我现在只使用Lisp大约一周了。这是
else
子句
T
是一个始终为真的常数。完美。再次感谢!或者,使用
和(>x5)`作为显式测试,然后使用
(t(*y.6))
。非常感谢您发布这篇文章。这是难以置信的信息。我的一个小问题是,你在条件句末尾放的(y)是什么?对不起,我现在只使用Lisp大约一周了。这是
else
子句
T
是一个始终为真的常数。完美。再次感谢!或者,使用
和(>x5)`作为显式测试,然后使用
(t(*y.6))