Добавление аргументов в список приводит к ошибке - PullRequest
0 голосов
/ 13 ноября 2010

Я попробовал пример, где нам нужно передать список в качестве аргументов, и если условие выполнено успешно, я хочу добавить результат в новый список.

Вот код:

(define get-description
  (lambda (codeValue newList)
    (cond
      ((= (car codeValue) 1) (cons "A" newlist))
      ((= (car codeValue) 2)(cons "B" newlist))      
      ((= (car codeValue) 3) "C")
      (else "Negative numbers are not valid"))))

Я передаю это как вызов функции:

(get-description (list 1 2 3) (list))

Я получаю вывод:

(cons "A" empty)

Вывод должен просто показать: (A)

Я использую DrRacket для написания своих программ и выбрал языковой режим: «Начинающий студент».

Почему я получаю cons и A с "" и empty в моем newlist?

Ответы [ 2 ]

2 голосов
/ 13 ноября 2010

Пожалуйста, не используйте «Начинающий студент» в качестве языка в Racket. Это подмножество, специально созданное для книги HtDP. Языки «рэкет», «r5rs», «довольно большой» больше похожи на настоящие схемы и должны работать для «Маленького схимера».

В вашем списке аргументов у вас есть (codeValue newList ), но в теле программы вы ссылаетесь на newlist . Все схемы, которые я использовал, чувствительны к регистру . Изменение newList на newlist сделало вашу программу отлично работающей на Chez Scheme и Guile.

Редактировать: Для пояснения, "A" - это строка . Схема также имеет дополнительный тип данных символ , который является просто именем и ничем иным (и, вероятно, это то, что вам нужно здесь). Вы, вероятно, хотите (cons 'A newlist), а не (cons "A" newlist), если вы ожидаете (A).

0 голосов
/ 13 ноября 2010

Другие схемы будут печатать только ("A"). Такой вывод явно является особенностью языка Ракетки.

Что касается того, почему A в кавычках, это потому, что это строковый объект, и это просто, как строковые объекты печатаются. Но если бы вы отобразили такой объект, вы бы получили A его одиноким.

...