Функция только выводит 1

common-lisp clisp

52 просмотра

1 ответ

Я пытаюсь создать код LISP, который читает 2 целых числа и выводит все числа между ними. мой текущий код

(defun range (x y)
  (if (< x y)
      x
      (1+ (range(x y))))

код компилируется и запускается, но выводит только «1».

Автор: Matt Источник Размещён: 08.11.2019 11:05

Ответы (1)


2 плюса

Не уверен, что именно вы хотите, но самое близкое, что я мог придумать, это:

(defun range (x y)
  (when (< x y)
    (print x)
    (range (1+ x) y)))

тестирование

CL-USER> (range 3 7)

3 
4 
5 
6 
NIL

Обрати внимание на

  • сделать правильный код
  • используйте when(или condили progn...), если хотите выполнить более одного действия после условия
  • 1+используется для увеличения параметра, а не полное выражение; думать об этом как о переменной цикла в традиционном языке
  • Ваша переменная становится «видимой» вне функции, только если вы напечатаете ее или добавите в список результатов.

Кроме того, пометьте свой вопрос common-lispдля лучшей видимости.

РЕДАКТИРОВАТЬ

доказательство того, что оригинальный код работает на некоторых экземплярах CLISP:

Welcome to GNU CLISP 2.49 (2010-07-07) <http://clisp.cons.org/>

Copyright (c) Bruno Haible, Michael Stoll 1992, 1993
Copyright (c) Bruno Haible, Marcus Daniels 1994-1997
Copyright (c) Bruno Haible, Pierpaolo Bernardi, Sam Steingold 1998
Copyright (c) Bruno Haible, Sam Steingold 1999-2000
Copyright (c) Sam Steingold, Bruno Haible 2001-2010

Type :h and hit Enter for context help.

[1]> (range 1 5)

*** - EVAL: undefined function RANGE
The following restarts are available:
USE-VALUE      :R1      Input a value to be used instead of (FDEFINITION 'RANGE).
RETRY          :R2      Retry
STORE-VALUE    :R3      Input a new value for (FDEFINITION 'RANGE).
ABORT          :R4      Abort main loop
Break 1 [2]>
[3]> (defun range (x y)
  (if (< x y)
      x
      (1+ (range(x y)))))
RANGE
[4]> (range 1 5)
1
[5]>
Автор: uselpa Размещён: 20.08.2016 09:36
Вопросы из категории :
32x32