Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String lisp比较_String_Comparison_Lisp_Int - Fatal编程技术网

String lisp比较

String lisp比较,string,comparison,lisp,int,String,Comparison,Lisp,Int,我试图在这样的函数中进行比较: (defun omember (x l) (cond ((null l) nil) ((eq (car l) x) t) ((string< (car l) x) (omember (x (cdr l)))) (t nil))) (定义omember(x l) (续) ((空l)无) ((eq(轿厢l)x)t) ((字符串

我试图在这样的函数中进行比较:

(defun omember (x l)
  (cond
    ((null l) nil)
    ((eq (car l) x) t)
    ((string< (car l) x) (omember (x (cdr l))))
    (t nil)))
(定义omember(x l)
(续)
((空l)无)
((eq(轿厢l)x)t)
((字符串<(左车)x)(omember(左车)))
(t零)
它只需遍历列表并搜索列表l中元素的x。因为传递的列表是排序的,所以不需要在所有列表中搜索值。只要值大于元素,就可以返回nil。但是,“lessthan”功能不起作用。我尝试了“string可以用于将函数对象应用于参数列表:

((apply *lessthan* (list (car l) x)) (do something))
或者,正如wvxvw所指出的,这不需要构建额外的列表:

((funcall *lessthan* (car l) x) (do something))
可以使用将函数对象应用于参数列表:

((apply *lessthan* (list (car l) x)) (do something))
或者,正如wvxvw所指出的,这不需要构建额外的列表:

((funcall *lessthan* (car l) x) (do something))

在代码中使用以下内容来区分这些类型:

[15]> (typep 7 'integer)
T
[16]> (typep "17" 'string)
T

在代码中使用以下内容来区分这些类型:

[15]> (typep 7 'integer)
T
[16]> (typep "17" 'string)
T

在递归omember周围使用括号时出错

(defun omember(x l)
  (cond
    ((null l) nil)
    ((= (car l) x) t)
    ((< (car l) x) (omember x (cdr l)))
    (t nil)
    )
  )
(定义omember(x l)
(续)
((空l)无)
(=(轿厢l)x)t)
(<(左车)x(右车)x(右车)
(无)
)
)
将使此操作适用于整数列表

(defun omember(x l)
      (cond
        ((null l) nil)
        ((string= (car l) x) t)
        ((string< (car l) x) (omember x (cdr l)))
        (t nil)
        )
      )
(定义omember(x l)
(续)
((空l)无)
((字符串=(汽车l)x)t)
((字符串<(左车)x)(omember x(cdr l)))
(无)
)
)
将使其适用于字符串列表


但是似乎没有办法使它同时适用于字符串列表和整数列表

在递归omember周围使用括号是错误的

(defun omember(x l)
  (cond
    ((null l) nil)
    ((= (car l) x) t)
    ((< (car l) x) (omember x (cdr l)))
    (t nil)
    )
  )
(defun omember(x l)
      (cond
        ((null l) nil)
        ((string= (car l) x) t)
        ((string< (car l) x) (omember x (cdr l)))
        (t nil)
        )
      )
(定义omember(x l)
(续)
((空l)无)
(=(轿厢l)x)t)
(<(左车)x(右车)x(右车)
(无)
)
)
将使此操作适用于整数列表

(defun omember(x l)
      (cond
        ((null l) nil)
        ((string= (car l) x) t)
        ((string< (car l) x) (omember x (cdr l)))
        (t nil)
        )
      )
(定义omember(x l)
(续)
((空l)无)
((字符串=(汽车l)x)t)
((字符串<(左车)x)(omember x(cdr l)))
(无)
)
)
将使其适用于字符串列表


但是似乎没有办法使它同时适用于字符串列表和整数列表

如果您希望以一般方式工作,则应将比较函数作为参数传递:

(defun omember(x l)
      (cond
        ((null l) nil)
        ((string= (car l) x) t)
        ((string< (car l) x) (omember x (cdr l)))
        (t nil)
        )
      )
(defun member-of-sorted (item list
                         &key (test #'=) (end-test #'<) (key #'identity))
  (loop :for tail :on list
        :for element := (funcall key (first tail))
        :until (funcall end-test item element)
        :when (funcall test item element)
        :do (return-from member-of-sorted tail))
  nil)

如果希望以常规方式工作,则应将比较函数作为参数传递:

(defun member-of-sorted (item list
                         &key (test #'=) (end-test #'<) (key #'identity))
  (loop :for tail :on list
        :for element := (funcall key (first tail))
        :until (funcall end-test item element)
        :when (funcall test item element)
        :do (return-from member-of-sorted tail))
  nil)

*lessthan*
是一个变量,它包含一个函数对象吗?要将整数作为字符串进行比较,只需在比较之前将它们
prin1-To-string
进行比较。因此,您可以执行
(mapcar#prin1-To-string列表)
,这将有效地将它强制为字符串列表。由于@wvxvw comma实际上是一个类型,我更改了它。至于函数名,我试图避免让人混淆,所以制作了一个不真实的函数,但它似乎让人混淆,所以我只需将代码复制到字段中。希望这能让我更敏感,我有一个find函数可以很好地用于t但是我必须在这里使用这样一个事实:传入的列表是经过排序的;并且避免遍历整个列表。这意味着我应该返回nil,并在发现x大于列表中的元素时立即结束搜索。
*lessthan*
是一个变量,持有一个函数对象吗?将整数作为字符串进行比较只需
prin1到字符串
就可以了在比较之前。所以您可以执行
(mapcar#'prin1-to-string列表)
,这将有效地将它强制为字符串列表。由于@wvxvw comma实际上是一个类型,我更改了它。至于函数名,我试图避免让人混淆,所以制作了一个不真实的函数,但它似乎让人混淆,所以我只需将代码复制到字段中。希望这能让我更敏感,我有一个find函数可以很好地用于t他的。但我必须在这里使用这样一个事实:传入的列表是排序的;并且避免遍历整个列表。这意味着我应该返回nil,并在发现x大于列表中的元素时立即结束搜索。问题是,我不知道在传入字符串列表和传入的整数。问题是我不知道当传入字符串列表和整数列表时,使用哪个lessthan函数可以使其同时工作。我已经向您展示了(在我的回答中)使用
typep
来区分int和string。您只需将两个函数重命名为
omember int
omember strings
,并引入一个接口函数
omember
,它将检查参数列表的第一个元素并相应地调用正确的函数。这假设所有元素列表中的元素类型相同。如果
x
始终是一个整数,则需要将其转换为字符串:5->“5”或“00000005”或您喜欢的任何形式。但请注意
(字符串<5”“51”)
=>1和
(字符串<500”“51”)
=>1。我已经向您展示了(在我的回答中)使用
typep
来区分int和string。您只需将两个函数重命名为
omember int
omember strings
,并引入一个接口函数
omember
,它将检查参数列表的第一个元素并相应地调用正确的函数。这假设所有元素列表中的元素类型相同。如果
x
始终是一个整数,则需要将其转换为字符串:5->“5”或“00000005”或您喜欢的任何内容。但请注意
(字符串<5”“51”)
=>1和
(字符串<500”“51”)
=>1。