2016-12-24 14 views
1

Мне нужно создать произвольную букву ASCII (верхний или нижний регистр) или символ (но не номер) в схеме, и мне было интересно, как это сделать. В настоящее время я получил кодГенерировать случайный символ ASCII

(define a 1) 
(define b 16) 
(define (s8 a b) 
    (when (<= a b) 
    (if (= (mod a 8) 0) 
     (write "h") 
     (write a)) 
    (s8 (+ a 1) b))) 
(s8 a b) 

, который работает (без ошибок), но вместо того, чтобы печатать случайное ASCII письмо/символ, я получаю «час», потому что я не знаю, как сделать это. Я гугл, но ничего не мог найти. Любая помощь будет оценена по достоинству. Благодаря!

EDIT:

(define random-char 
    (let* ((chars '("a" "e" "i" "o" "u")) 
     (len (length chars))) 
    (lambda() 
     (list-ref chars (random len))))) 
(define a 1) 
(define b 16) 
(define (s8 a b) 
    (when (<= a b) 
    (if (= (mod a 8) 0) 
     (random-char) 
     (write a)) 
    (s8 (+ a 1) b))) 
(s8 a b) 

дает ошибку

1234567 
Error: execute: unbound symbol: "random" [s8, s8, s8, s8, s8, s8, s8, s8, random-char] 
+0

Не изобретайте велосипед! Схема имеет встроенные процедуры для генерации случайных значений. –

ответ

1

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

(define random-letter 
     ; this is to avoid redefining the list of acceptable letters every time 
    (let* ((chars '("a" "e" "i" "o" "u")) 
     ; and this is to pre-calculate the length 
     (len (length chars))) 
    (lambda() ; the actual procedure, it doesn't require arguments 
     (list-ref chars (random len))))) ; pick a random index from list 

Make обязательно добавьте все необходимые символы в список. Используя процедуру, так же легко, как это:

(random-letter) 
=> "u" 
+0

Я положил определение в начале, а затем положил в '(random-letter)' вместо '(написать« h »)' и дал ошибку '1234567 Ошибка: выполнить: несвязанный символ:« random »[s8, s8, s8, s8, s8, s8, s8, s8, random-char]. – heather

+0

Это означает, что ваш интерпретатор не имеет «случайной» процедуры или назван по-разному. Какой интерпретатор вы используете? проверьте документацию, чтобы найти правильную процедуру для использования, или, альтернативно, загрузить Racket, которая действительно хороша для обучения. Кроме того, я не уверен, что вы выполняете код, отображаемый вывод не имеет смысла - вы должны очистить все и просто скопировать-вставить приведенные выше фрагменты –

+0

Я использую repl.it, онлайн-переводчик. В нем говорится: «Переводчик BiwaScheme версии 0.6.4 Copyright (C) 2007-2014 Yutaka HARA и команда BiwaScheme». Я редактировал код, которым я управлял. – heather

0

Вот как вы можете сделать это в промышленной прочности Схема производный языка: в частности рэкет. Он предполагает различные функциональные возможности, которые могут потребоваться для реализации в схеме более голой кости, например функций , для создания строк, для преобразования между символами и целыми числами и PRNG (а также карри).

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

(define latin-alpha-string 
    ;; This assumes that a-z are a sequence of adjacent, increasing 
    ;; character codes, as are A-Z, but nothing about their relative values 
    (let ([lca (char->integer #\a)] 
     (uca (char->integer #\A))) 
    ;; build-string makes a string by calling a function which takes an index 
    ;; and returns the character at that index. 
    (build-string (+ 26 26) 
        (λ (i) 
        (integer->char 
        (if (< i 26) 
         (+ lca i) 
         (+ uca (- i 26)))))))) 

(define (random-string-char s (rand random)) 
    ;; The general case: return a random element of a string. rand, if provided, 
    ;; should be a function of one argument, i, which returns a (pseudo-)random 
    ;; integer in [0, i). 
    (string-ref s (rand (string-length s)))) 

(define random-latin-alpha-char 
    ;; and here's a curried version of the above for latin-alpha strings 
    (curry random-string-char latin-alpha-string))