代码之家  ›  专栏  ›  技术社区  ›  Starscreen60

方案中的嵌套lambda

  •  0
  • Starscreen60  · 技术社区  · 9 年前

    我正在尝试在scheme中定义一个函数,该函数在调用时打印一条消息,后跟一个换行符。为此,我尝试使用这样的嵌套lambda:

    (define message 
        (lambda (msg)
            (lambda (newL) 
                (newline)
            )
        (display msg))  
    )
    

    但是,当我这样做时,并像这样调用函数:

    (message "#f")
    

    它只打印f,不创建换行符。如果我在函数中颠倒lambda顺序并交换newL和msg-lambda的位置,那么它只打印一行换行符而不显示消息!

    在该代码块中调用该函数:

    (define (permute upList)
        (if (null? upList)
            (message "#f")
             ;permutation code
        )
    )    
    

    不使用嵌套lambda时收到的错误消息如下:

    错误:调用非过程:#

        Call history:
    
        <syntax>          (permute (quote ()))
        <syntax>          (quote ())
        <syntax>          (##core#quote ())
        <eval>    (permute (quote ()))
        <eval>    [permute] (null? upList)
        <eval>    [permute] (message "#f")
        <eval>    [message] ((display msg) (newline))
        <eval>    [message] (display msg)
        <eval>    [message] (newline)   <--
    

    任何帮助都将不胜感激。

    1 回复  |  直到 9 年前
        1
  •  0
  •   sjamaan    9 年前

    在这段代码中,您只创建一个过程对象,然后立即丢弃该对象:

    (define message 
      (lambda (msg)
        (lambda (newL) 
          (newline))
        (display msg)))
    

    这就像在做:

    (define message 
      (lambda (msg)
        1234
        (display msg)))
    

    这里的1234 计算,但该值被完全忽略。

    如果您有一个过程,并且希望立即调用它,则必须用一组额外的圆括号括起来(因为在Scheme中,一般来说,parens表示应用程序):

    (define message 
      (lambda (msg)
        ((lambda (newL) 
           (newline)) #f)
        (display msg)))
    

    但是,正如其他人所指出的,在这种情况下不需要创建嵌套lambda。另外,这个过程忽略了它的论点,这就是为什么我必须发明一个论点来通过;我使用#f是因为这是典型的“不在乎”值。你可以这样做:

    (define message 
      (lambda (msg)
        (newline)
        (display msg)))
    
    推荐文章