【问题标题】:lisp: properly form if statementlisp:正确形成 if 语句
【发布时间】:2019-11-26 00:30:19
【问题描述】:

作为自己学习通用 lisp 的任务,我正在尝试重新创建 lodash

在重新创建_.chunk 的过程中,我编写了以下代码来测试可选参数

(defun _.chunk (array &optional size)
    (if (size)
        (write ("there") )
        (write ("not") )
    ) 
)  

设置(setf x #('a 'b 'c 'd)),然后运行(_.chunk x),出现错误:

; caught ERROR:
;   illegal function call

;     (SB-INT:NAMED-LAMBDA _.CHUNK
;         (ARRAY &OPTIONAL SIZE)
;       (BLOCK _.CHUNK
;         (IF (SIZE)
;             (WRITE ("there"))
;             (WRITE ("not"))))) 

测试可选函数参数的正确方法是什么?

【问题讨论】:

  • 好吧,对于初学者来说,不要试图将它作为一个函数来调用!不太正确的方法(但在许多情况下已经足够好了):(if size (write "there") (write "not there"))。不要将函数调用括号括在不是函数调用的东西上!
  • 真实方式:&optional (size 0 size-p):变量名,默认值,存在指示变量名。现在如果size-p 为真,则指定size。即使size0size-p 也会告诉您它是显式指定的还是默认的。

标签: lisp common-lisp


【解决方案1】:

size-p,可选变量的名称,可以在关键字或可选参数的默认值之后指定,如果参数作为参数传递给函数调用,则为真.

所以你可以这样做:

(defun _.chuck (array &optional (size 0 size-p))
  (if size-p
      (rest of your form...)))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-03
    相关资源
    最近更新 更多