With your code if I write:
(displayer list1)
it will display:
(read id $$)
But if I change it to:
#lang racket
(define list1 '("read" "id" "$$"))
(define (displayer list1)
(display (remover list1)))
(define (remover list1)
(remove "$$" list1))
This way when you run
(displayer list1)
It will return
(read id)
remember that in functional languages, everything is an expression and dealing with "variables" as not mutable is the preferred way (working without state makes it easier to verify, optimize, and parallelize programs, and easier to write automated tools to perform those tasks, read more here: http://en.wikipedia.org/wiki/Functional_programming#Comparison_to_imperative_programming )
, so if you want to remove an element from a list and then display you have to write a function that returns a new list with less elements
On the other hand, Racket is not a pure functional language like Haskell, so as you mentioned, if you really want to redefine the value referenced by the variable "list1" you can use Racket in a imperative way like this:
#lang racket
(define list1 '("read" "id" "$$"))
(define (displayer list1)
(set! list1 (remover list1))
(newline)
(display list1))
(define (remover list1)
(remove "$$" list1))
The set! redirects the list1 to point to the new value from now on
You can read more about this here: http://htdp.org/2003-09-26/Book/curriculum-Z-H-44.html