Motivation:
Structures are a relatively low-level facility. 'Speed' was an important design goal. Indirection via writer functions is not supported by the standard (as I read it). Today, use CLOS as the default, unless one needs better efficiency of structures (faster read and writes of slots with structures are sometimes possible).
First - style:
Don't use INTERN, use FIND-SYMBOL. Also specify the package, otherwise FIND-SYMBOL will use the runtime value of *package* as the package
Second - DEFSTRUCT
If I read the ANSI CL standard correctly, it is not that DEFSTRUCT creates writer functions for slots like DEFCLASS does.
CL-USER 24 > (defstruct foo bar baz)
FOO
CL-USER 25 > #'(setf foo-bar)
Error: Undefined function (SETF FOO-BAR) in form (FUNCTION (SETF FOO-BAR)).
So, constructing such a name (SETF FOO-BAR) and trying to find a function for that will fail, since there is no such function defined by the DEFSTRUCT.
That in user code (setf (foo-bar some-struct) 42) works, is based on defined SETF expansions provided by DEFSTRUCT, but not on defined SETF accessor functions.
Some Common Lisp implementations may provide writer functions as a non-standard extension to ANSI CL.
Possible solutions:
a) use CLOS classes, DEFCLASS does what you want
b) write the writer functions yourself
(defun (setf foo-bar) (new-value struct)
(setf (foo-bar struct) new-value))
Now:
(funcall (fdefinition '(setf foo-bar)) 300 *foo*)
Above then works.
c) (SETF SLOT-VALUE) - another non-standard feature of some implementations.
In some implementations of Common Lisp this works not only for CLOS classes, but also for structures:
(setf (slot-value some-struct 'bar) 42)
I'm not sure if Allegro CL does support that, but that would be easy to find out.